home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / tools / d / jydrv210.lzh / JOYDRV.S < prev    next >
Text File  |  1998-12-27  |  62KB  |  2,539 lines

  1. .cpu    68000
  2.  
  3. JOY_MAX        equ    7                * 接続可能パット数
  4. DATA_SIZE    equ    256                * データサイズ
  5. PAD_TYPE_ATARI    equ    $0000                * パッドタイプ = アタリ
  6. PAD_TYPE_MD    equ    $0001                * パッドタイプ = メガドライブ
  7. PAD_TYPE_SS    equ    $0002                * パッドタイプ = サターン
  8. PAD_TYPE_PS    equ    $0003                * パッドタイプ = プレイステーション
  9. PAD_TYPE_NOTAP    equ    $0000                * マルチタップ無し
  10. PAD_TYPE_MTAP    equ    $0100                * マルチタップ有り
  11.  
  12. COM_DATA_INIT    .macro
  13.     .dc.w    0                    * ドライバ JOYDRV
  14.     .dc.w    JOY_MAX-1                * JOY STICKポート1 最大パッド数
  15.     .dc.w    2                    * マルチタップ判定を行う(キャッシュあり)
  16.     .dc.w    1                    * JOYDRV拡張モード
  17.     .dcb.b    8,$00                    * 予約領域
  18.     .dcb.b    16,$00                    * アナログデータ格納領域
  19.     .dcb.b    32,$00                    * 予約領域
  20.     .dcb.b    32,$00                    * 受信用バッファ
  21.     .dcb.b    32,$00                    * 送信用バッファアドレス
  22. .endm
  23.  
  24. JOY_DATA_INIT    .macro
  25.     .dc.l    $FFFFFFFF                * パッドタイプ = 不明
  26.     .dc.w    0                    * ビット変換無し
  27.     .dc.l    $0003004f                * 十字キーエミュレート(上下左右,しきい値$4F)
  28.     .dc.w    0                    * データはキャッシュされていない
  29.     .dc.w    0                    * モーター振動ステータス
  30.     .dcb.b    18,$00                    * 予約領域
  31.     .dc.w    $fffe                    * 変換データ
  32.     .dc.w    $fffd                    * 変換データ
  33.     .dc.w    $fffb                    * 変換データ
  34.     .dc.w    $fff7                    * 変換データ
  35.     .dc.w    $ffef                    * 変換データ
  36.     .dc.w    $ffdf                    * 変換データ
  37.     .dc.w    $ffbf                    * 変換データ
  38.     .dc.w    $ff7f                    * 変換データ
  39.     .dc.w    $feff                    * 変換データ
  40.     .dc.w    $fdff                    * 変換データ
  41.     .dc.w    $fbff                    * 変換データ
  42.     .dc.w    $f7ff                    * 変換データ
  43.     .dc.w    $efff                    * 変換データ
  44.     .dc.w    $dfff                    * 変換データ
  45.     .dc.w    $bfff                    * 変換データ
  46.     .dc.w    $7fff                    * 変換データ
  47.     .dcb.b    32,$00                    * 受信用バッファ
  48.     .dcb.b    32,$00                    * 送信用バッファアドレス
  49.     .dc.l    $00000000                * プレイステーション振動パッドコマンドアドレス
  50.     .dc.l    0                    * PSパッドアクセス間隔計測用
  51.     .dc.w    $0000                    * プレイステーション振動パッドステータス
  52.     .dcb.b    118,$00                    * 末端+1 = 256
  53. .endm
  54.  
  55. .offset        0                    * 共通データ領域フォーマット
  56. COM_CTRL_DRV:
  57.     .ds.w    1                    * 制御ドライバ指定
  58. COM_JOY1_MAX:
  59.     .ds.w    1                    * JOY STICKポート1 最大パッド数
  60. COM_HANTEI_MODE:
  61.     .ds.w    1                    * パッド接続ケーブル/マルチタップ判定モード
  62. COM_IOCS3B_OUT:
  63.     .ds.w    1                    * IOCS$3B出力モード
  64. COM_YOBI_001:
  65.     .ds.b    8                    * 予約領域(8バイト)
  66. COM_ANALOG_DATA:
  67.     .ds.b    16                    * アナログデータ格納領域
  68. COM_YOBI_002:
  69.     .ds.b    32                    * 予約領域(32バイト)
  70. COM_RCV_BUF:
  71.     .ds.b    32                    * 通信用受信バッファ
  72. COM_SND_BUF:
  73.     .ds.b    32                    * 通信用送信バッファアドレス
  74.  
  75. .offset        0                    * ジョイスティック別データ領域フォーマット
  76. JOY_PAD_TYPE:
  77.     .ds.l    1                    * パッドタイプ
  78. JOY_CNV_MODE:
  79.     .ds.w    1                    * ビット変換モード
  80. JOY_PLUS_EMU:
  81.     .ds.l    1                    * アナログスティック -> 十字キーエミュレート
  82. JOY_CACHE_STS:
  83.     .ds.w    1                    * マルチタップキャッシュ制御
  84. JOY_MOTOR_STS:
  85.     .ds.w    1                    * モーターステータス
  86. JOY_YOBI_001:
  87.     .ds.b    18                    * 予約領域(18バイト)
  88. JOY_CNV_DATA:
  89.     .ds.w    16                    * ビット変換データ
  90. JOY_RCV_BUF:
  91.     .ds.b    32                    * 通信用受信バッファ
  92. JOY_SND_BUF:
  93.     .ds.b    32                    * 通信用送信バッファ
  94. JOY_PS_MOTOR_ADR:
  95.     .ds.l    1                    * プレイステーション振動パッドコマンドアドレス
  96. JOY_PS_MOTOR_TIME:
  97.     .ds.l    1                    * PSパッドアクセス間隔計測用
  98. JOY_PS_MOTOR_STS:
  99.     .ds.w    1                    * プレイステーション振動パッドステータス
  100.  
  101. .text
  102. DEVHEAD:
  103.     .dc.l    $ffffffff                * リンクポインタ
  104.     .dc.w    $8020                    * デバイス属性
  105.     .dc.l    STRTG_RTN                * ストラテジルーチンアドレス
  106.     .dc.l    DEV_RTN                    * ドライバルーチンアドレス
  107. KEEP_CHK_NAME:
  108.     .dc.b    'JOYDRV*/'                * デバイス名
  109. KEEP_CHK_VER:
  110.     .dc.b    $02,$01,$00,$00                * バージョン(X.XXY) X:数値 Y:アルファベット
  111.  
  112. IOCS3B:                            * IOCS3B処理
  113.     tst.w    d1
  114.     bmi    MODECNV_RTN                * モード変更か?
  115.     movem.l    d1-d6/a1-a4,-(a7)            * レジスタ保存
  116.     lea.l    $e9a001,a0                * ジョイスティックI/Oアドレス
  117.     lea.l    6(a0),a2                * ジョイスティックI/Oアドレス
  118.     move.w    COM_DATA+COM_HANTEI_MODE(pc),d0
  119.     beq    ATARI68                    * アタリ他68通常パッド読み込み
  120.     move.b    #9,(a2)                    * ON
  121.     tst.b    (a0)                    * WAIT
  122.     move.b    (a0),d0
  123.     andi.b    #$0f,d0
  124.     cmpi.b    #2,d0
  125.     beq    PS_CABLE                * プレイステーション接続ケーブルか?
  126.     cmpi.b    #1,d0
  127.     beq    SATURN_EXT                * セガサターンマルチタップまたはマルチコンか?
  128.     cmpi.b    #3,d0
  129.     beq    MD_MTAP                    * メガドライブマルチタップか?
  130.     tst.w    d1
  131.     bne    ATARI68
  132.     andi.b    #7,d0                    * 下位3ビット有効
  133.     cmpi.b    #4,d0
  134.     beq    SATURN_NORMAL                * サターンパットか?
  135.  
  136. ATARI68:                        * アタリ他68通常パッド読み込み
  137.     moveq.l    #$ff,d0                    * パッドタイプ = 不明
  138.     cmpi.w    #2,d1
  139.     bcc    IOCS3B_ERROR                * ジョイスティック番号が範囲外か?
  140.     move.w    d1,d0
  141.     add.w    d0,d0                    * ジョイスティック番号*2
  142. ATARI68_1:                        * ここに飛ぶには、d0に(0,2)とd1にJOY番号をセットすること
  143.     moveq.l    #8,d2
  144.     add.b    d0,d2                    * ビットOFF情報取得
  145.     moveq.l    #9,d3
  146.     add.b    d0,d3                    * ビットON情報取得
  147.     moveq.l    #0,d4                    * パッドタイプ = アタリ
  148.     adda.w    d0,a0
  149.     lsl.w    #8,d1
  150.     lea.l    JOY_DATA(pc),a1
  151.     adda.w    d1,a1
  152.     move.w    sr,d5                    * SRレジスタ保持
  153.     ori.w    #$0700,sr                * 割り込み禁止
  154.     move.b    d3,(a2)                    * ON
  155.     move.b    d2,(a2)                    * OFF
  156.     move.b    d3,(a2)                    * ON
  157.     move.b    d2,(a2)                    * OFF
  158.     move.b    d3,(a2)                    * ON
  159.     moveq.l    #$ff,d0                    * WAIT
  160.     move.b    (a0),d0                    * ポート読み込み
  161.     move.b    d2,(a2)                    * OFF
  162.     move.b    d0,d2                    * WAIT
  163.     move.b    (a0),d0                    * ポート読み込み
  164.     move.b    d3,(a2)                    * ON
  165.     move.b    d0,d3
  166.     andi.b    #$0c,d0
  167.     bne    ATARI68_3                * 変換コネクタを使用していないか?
  168.     move.b    (a0),d1                    * 6ボタン情報読み込み
  169.     move.l    #PAD_TYPE_MD*65536+PAD_TYPE_NOTAP+$01,d4    * パッドタイプ = メガドラ6B
  170.     move.b    d3,d0
  171.     andi.b    #$0f,d0
  172.     beq    ATARI68_2                * 6ボタンか?
  173.     st.b    d1                    * 3ボタンの時,6ボタンの位置を無効にする
  174.     clr.b    d4                    * パッドタイプ = メガドラ3B
  175. ATARI68_2:
  176.     ori.b    #$f0,d1                    * 未使用ビット消去
  177.     ori.b    #$0f,d3                    * 未使用ビット消去
  178.     and.b    d1,d3                    * アダプタと同じ情報を生成する
  179.     exg.l    d3,d2                    * 情報交換
  180. ATARI68_3:
  181.     move.w    d5,sr                    * SRレジスタ復帰
  182.     move.b    d2,d0
  183.     lsl.b    #1,d0
  184.     asr.b    #2,d0
  185.     ori.b    #$6f,d0                    * STARTとAボタンのみにする(bit 7..START bit 4..A)
  186.     and.b    d3,d0                    * 十字キーの情報にSTARTとAボタン情報を付加する
  187.     ror.w    #4,d2
  188.     ori.w    #$0fff,d2                * 6ボタン情報のみにする
  189.     move.w    d2,d3
  190.     ror.w    #4,d3                    * TWIN PLUS対応(右十字キー)
  191.     and.w    d2,d3                    * 6ボタンと右十字キー情報合成
  192.     and.w    d3,d0                    * 全情報セット
  193.     move.l    d4,JOY_PAD_TYPE(a1)            * パッドタイプ保存
  194.     clr.b    COM_DATA+COM_ANALOG_DATA        * アナログ読み込み無し
  195.  
  196. IOCS3B_CNV_MODE:                    * ビット変換処理(D0.Wに読み込み結果,A1.Lに領域の先頭アドレス)
  197.     tst.w    JOY_CNV_MODE(a1)
  198.     beq    IOCS3B_CODE_MODE
  199.     lea.l    JOY_CNV_DATA+30(a1),a0
  200.     moveq.l    #$ff,d1
  201.     moveq.l    #15,d2
  202. IOCS3B_CNV_MODE_1:
  203.     btst.l    d2,d0
  204.     bne    IOCS3B_CNV_MODE_2
  205.     and.w    (a0),d1
  206. IOCS3B_CNV_MODE_2:
  207.     subq.w    #2,a0
  208.     dbra    d2,IOCS3B_CNV_MODE_1
  209.     move.l    d1,d0
  210.  
  211. IOCS3B_CODE_MODE:                    * 出力モード設定処理
  212.     move.w    COM_DATA+COM_IOCS3B_OUT(pc),d1
  213.     bne    IOCS3B_END
  214.     andi.w    #$00ff,d0
  215.     ext.l    d0
  216.     ori.b    #$90,d0
  217.  
  218. IOCS3B_END:                        * IOCS3B処理終了
  219.     movem.l    (a7)+,d1-d6/a1-a4            * レジスタ復帰
  220.     rts
  221.  
  222. IOCS3B_ERROR:                        * D0.L にPAD TYPE D1.W にJOY番号を格納
  223.     cmpi.w    #JOY_MAX,d1
  224.     bcc    IOCS3B_ERROR_1
  225.     lsl.w    #8,d1
  226.     lea.l    JOY_DATA(pc),a1
  227.     adda.w    d1,a1
  228.     move.l    d0,JOY_PAD_TYPE(a1)            * パッドタイプ格納
  229.     bmi    IOCS3B_ERROR_1
  230.     moveq.l    #$ff,d0
  231.     clr.b    COM_DATA+COM_ANALOG_DATA        * アナログ読み込み無し
  232.     bra    IOCS3B_CODE_MODE
  233. IOCS3B_ERROR_1:
  234.     moveq.l    #0,d0                    * エラー
  235.     bra    IOCS3B_END
  236.  
  237. PLUS_EMU_SET:                        * 十字キーエミュレート設定
  238.     move.w    JOY_PLUS_EMU(a1),d4
  239.     and.b    COM_DATA+COM_ANALOG_DATA(pc),d4
  240.     move.w    JOY_PLUS_EMU+2(a1),d1
  241.     moveq.l    #0,d2
  242.     moveq.l    #0,d3
  243.     st.b    d2
  244.     eor.b    d1,d2
  245.     btst.l    #1,d4
  246.     beq    PLUS_EMU_SET_2
  247.     move.b    COM_DATA+COM_ANALOG_DATA+2(pc),d3
  248.     cmp.w    d1,d3
  249.     bgt    PLUS_EMU_SET_1
  250.     andi.w    #$fffb,d0                * 左キーエミュレート
  251.     bra    PLUS_EMU_SET_2
  252. PLUS_EMU_SET_1:
  253.     cmp.w    d2,d3
  254.     blt    PLUS_EMU_SET_2
  255.     andi.w    #$fff7,d0                * 右キーエミュレート
  256. PLUS_EMU_SET_2:
  257.     btst.l    #0,d4
  258.     beq    PLUS_EMU_SET_4
  259.     move.b    COM_DATA+COM_ANALOG_DATA+1(pc),d3
  260.     cmp.w    d1,d3
  261.     bgt    PLUS_EMU_SET_3
  262.     andi.w    #$fffe,d0                * 上キーエミュレート
  263.     bra    PLUS_EMU_SET_4
  264. PLUS_EMU_SET_3:
  265.     cmp.w    d2,d3
  266.     blt    PLUS_EMU_SET_4
  267.     andi.w    #$fffd,d0                * 下キーエミュレート
  268. PLUS_EMU_SET_4:
  269.     btst.l    #3,d4
  270.     beq    PLUS_EMU_SET_6
  271.     move.b    COM_DATA+COM_ANALOG_DATA+4(pc),d3
  272.     cmp.w    d1,d3
  273.     bgt    PLUS_EMU_SET_5
  274.     andi.w    #$fbff,d0                * 左キーエミュレート
  275.     bra    PLUS_EMU_SET_6
  276. PLUS_EMU_SET_5:
  277.     cmp.w    d2,d3
  278.     blt    PLUS_EMU_SET_6
  279.     andi.w    #$f7ff,d0                * 右キーエミュレート
  280. PLUS_EMU_SET_6:
  281.     btst.l    #2,d4
  282.     beq    PLUS_EMU_SET_8
  283.     move.b    COM_DATA+COM_ANALOG_DATA+3(pc),d3
  284.     cmp.w    d1,d3
  285.     bgt    PLUS_EMU_SET_7
  286.     andi.w    #$feff,d0                * 上キーエミュレート
  287.     bra    PLUS_EMU_SET_8
  288. PLUS_EMU_SET_7:
  289.     cmp.w    d2,d3
  290.     blt    PLUS_EMU_SET_8
  291.     andi.w    #$fdff,d0                * 下キーエミュレート
  292. PLUS_EMU_SET_8:
  293.     rts
  294.  
  295. SATURN_NORMAL:                        * サターン,ノーマルパッド読み込み
  296.     moveq.l    #$ff,d0                    * データ初期化
  297.     moveq.l    #8,d2
  298.     move.b    (a0),d0                    * ポート読み込み(Lボタン)
  299.     move.b    d2,(a2)                    * PC4 = 0
  300.     moveq.l    #9,d3
  301.     lsl.w    #8,d1
  302.     lea.l    JOY_DATA(pc),a1
  303.     adda.w    d1,a1
  304.     lsl.b    #1,d0
  305.     ori.b    #$e0,d0                    * Lボタンのみ有効にする
  306.     tst.b    (a0)                    * WAIT
  307.     move.b    (a0),d4                    * ポート読み込み(上,下,左,右)
  308.     move.b    d3,(a2)                    * PC4 = 1
  309.     move.b    #$d,(a2)                * PC6 = 1
  310.     andi.b    #$0f,d4                    * 方向キーのみを有効にする
  311.     andi.b    #$f0,d0                    * WAIT
  312.     tst.b    (a0)                    * WAIT
  313.     move.b    (a0),d1                    * ポート読み込み(START,A,C,B)
  314.     move.b    d2,(a2)                    * PC4 = 0
  315.     lsl.b    #4,d1
  316.     or.b    d1,d4                    * 上,下,左,右 + START,A,C,B
  317.     tst.b    (a0)                    * WAIT
  318.     move.b    (a0),d1                    * ポート読み込み(Rボタン,X,Y,Z)
  319.     move.b    d3,(a2)                    * PC4 = 1
  320.     move.b    #$c,(a2)                * PC6 = 0
  321.     andi.b    #$0f,d1                    * ボタンのみを有効にする
  322.     or.b    d1,d0                    * L + R,X,Y,Z
  323.     lsl.w    #8,d0                    * L,R,X,Y,Zを上位に
  324.     move.b    d4,d0                    * 全データセット
  325.     clr.b    COM_DATA+COM_ANALOG_DATA        * アナログ読み込み無し
  326.     move.l    #PAD_TYPE_SS*65536,JOY_PAD_TYPE(a1)    * パッドタイプ = サターンデジタル(マルチタップ無し)
  327.     bra    IOCS3B_CNV_MODE
  328.  
  329. SATURN_EXT:                        * サターン,マルチタップ読み込み
  330.     move.b    #8,(a2)                    * PC4 = 0
  331.     moveq.l    #4,d0
  332.     bsr    JOY_WAIT
  333.     move.l    #PAD_TYPE_SS*65536,d6            * パッドタイプ = サターン
  334.     moveq.l    #1,d4                    * 接続コントローラ数
  335. SATURN_EXT_1:
  336.     bsr    SATURN_GETDATA                * データ読み込み
  337.     cmpi.b    #4,d2
  338.     bne    SATURN_EXT_2                * マルチタップ以外か?
  339.     bsr    SATURN_GETDATA                * データ読み込み
  340.     move.w    d2,d4                    * 接続コントローラ数設定
  341.     move.w    #PAD_TYPE_MTAP,d6            * パッドタイプ = サターン + マルチタップ
  342.     bra    SATURN_EXT_1
  343. SATURN_EXT_2:
  344.     cmp.w    COM_DATA+COM_JOY1_MAX(pc),d4
  345.     ble    SATURN_EXT_3
  346.     move.w    COM_DATA+COM_JOY1_MAX(pc),d4
  347. SATURN_EXT_3:
  348.     cmp.w    d4,d1
  349.     beq    SATURN_EXT_ERROR3            * タップ最大数+1
  350.     bgt    SATURN_EXT_ERROR2            * JOY番号範囲外
  351.     move.w    d1,d0
  352.     lsl.w    #8,d0
  353.     lea.l    JOY_DATA(pc),a1
  354.     adda.w    d0,a1                    * 対象JOY番号のデータ領域
  355.     cmpi.w    #1,COM_DATA+COM_HANTEI_MODE
  356.     beq    SATURN_EXT_4                * キャッシュ無し指定か
  357.     move.l    JOY_PAD_TYPE(a1),d0
  358.     clr.b    d0
  359.     cmp.l    d6,d0
  360.     bne    SATURN_EXT_4                * 前回がサターンマルチタップ以外か
  361.     tst.b    JOY_CACHE_STS(a1)
  362.     bne    SATURN_EXT_9                * キャッシュされているデータがあるか
  363. SATURN_EXT_4:
  364.     move.w    d4,COM_DATA+COM_RCV_BUF            * パッド数セット
  365.     lea.l    JOY_DATA(pc),a3                * データ領域先頭アドレス
  366.     lea.l    JOY_RCV_BUF(a3),a4
  367.     subq.w    #1,d4
  368.     bra    SATURN_EXT_6
  369. SATURN_EXT_5:
  370.     lea.l    DATA_SIZE(a3),a3            * 次のJOY番号のデータ領域
  371.     lea.l    JOY_RCV_BUF(a3),a4
  372.     bsr    SATURN_GETDATA                * データ読み込み
  373. SATURN_EXT_6:
  374.     move.b    d2,d6
  375.     move.l    d6,JOY_PAD_TYPE(a3)
  376.     move.b    d2,(a4)+                * コントローラタイプ
  377.     move.b    d3,(a4)+                * 転送バイト数
  378.     cmpi.b    #$f,d2
  379.     beq    SATURN_EXT_8                * コントローラが未接続か
  380.     move.w    d3,d5                    * 転送バイト数設定
  381.     subq.w    #1,d5
  382. SATURN_EXT_7:
  383.     bsr    SATURN_GETDATA                * データ読み込み
  384.     move.b    d2,(a4)+                * 1個目のデータセット
  385.     move.b    d3,(a4)+                * 2個目のデータセット
  386.     dbra    d5,SATURN_EXT_7
  387. SATURN_EXT_8:
  388.     st.b    JOY_CACHE_STS(a3)            * キャッシュデータ有りにする
  389.     dbra    d4,SATURN_EXT_5
  390. SATURN_EXT_9:
  391.     move.b    #9,(a2)                    * PC4 = 1
  392.     clr.b    JOY_CACHE_STS(a1)            * キャッシュデータ無しにする
  393.     lea.l    COM_DATA+COM_ANALOG_DATA(pc),a0        * アナログデータ格納エリア
  394.     lea.l    JOY_RCV_BUF(a1),a2
  395.     moveq.l    #0,d0
  396.     move.b    (a2)+,d0                * コントローラタイプ取得
  397.     add.w    d0,d0                    * 2倍
  398.     move.w    SATURN_PADTYPE(pc,d0.w),d0
  399.     jmp    SATURN_PADTYPE(pc,d0.w)            * タイプ別処理に飛ぶ
  400.  
  401. SATURN_PADTYPE:
  402.     .dc.w    SATURN_DIGITAL-SATURN_PADTYPE        * デジタルパッド
  403.     .dc.w    SATURN_ANALOG-SATURN_PADTYPE        * アナログパッド
  404.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  405.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * マルチタップ
  406.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  407.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  408.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  409.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  410.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  411.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  412.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  413.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  414.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  415.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  416.     .dc.w    SATURN_RESERVE-SATURN_PADTYPE        * ?
  417.     .dc.w    SATURN_NOPAD-SATURN_PADTYPE        * 未接続
  418.  
  419. SATURN_DIGITAL:
  420. SATURN_ANALOG:
  421.     clr.b    (a0)                    * アナログ読み込み情報クリア
  422.     move.b    (a2)+,d4                * 転送バイト数
  423.     moveq.l    #$ff,d0
  424.     move.b    (a2)+,d0                * 上、下、左、右の読み込み
  425.     ror.w    #4,d0
  426.     move.b    (a2)+,d0                * B、C、A、STARTの読み込み
  427.     ror.w    #4,d0
  428.     move.b    (a2)+,d0                * X、Y、Z、Rの読み込み
  429.     ror.w    #4,d0
  430.     ori.b    #$0f,d0
  431.     move.b    (a2)+,d1                * Lの読み込み
  432.     lsr.b    #4,d1
  433.     roxr.w    #4,d0
  434.     subq.b    #2,d4
  435.     beq    IOCS3B_CNV_MODE                * デシタルデータ ONLYか
  436.     move.b    (a2)+,d1                * 左右アナログ値(上位4ビット)の読み込み
  437.     lsl.b    #4,d1
  438.     or.b    (a2)+,d1                * 上位4ビット + 左右アナログ値(下位4ビット)
  439.     move.b    d1,2(a0)                * 左右アナログ値セット
  440.     ori.b    #$02,(a0)                * 左右アナログ値有効
  441.     subq.b    #1,d4
  442.     beq    SATURN_ANALOG_1
  443.     move.b    (a2)+,d1                * 上下アナログ値(上位4ビット)の読み込み
  444.     lsl.b    #4,d1
  445.     or.b    (a2)+,d1                * 上位4ビット + 上下アナログ値(下位4ビット)
  446.     move.b    d1,1(a0)                * 上下アナログ値セット
  447.     ori.b    #$01,(a0)                * 上下アナログ値有効
  448.     subq.b    #1,d4
  449.     beq    SATURN_ANALOG_1
  450.     move.b    (a2)+,d1                * Rアナログ値(上位4ビット)の読み込み
  451.     lsl.b    #4,d1
  452.     or.b    (a2)+,d1                * 上位4ビット + Rアナログ値(下位4ビット)
  453.     move.b    d1,5(a0)                * Rアナログ値セット
  454.     ori.b    #$10,(a0)                * Rアナログ値有効
  455.     subq.b    #1,d4
  456.     beq    SATURN_ANALOG_1
  457.     move.b    (a2)+,d1                * Lアナログ値(上位4ビット)の読み込み
  458.     lsl.b    #4,d1
  459.     or.b    (a2)+,d1                * 上位4ビット + Lアナログ値(下位4ビット)
  460.     move.b    d1,6(a0)                * Lアナログ値セット
  461.     ori.b    #$20,(a0)                * Lアナログ値有効
  462. SATURN_ANALOG_1:
  463.     bsr    PLUS_EMU_SET                * 十字キーエミュレート設定
  464.     bra    IOCS3B_CNV_MODE
  465.  
  466. SATURN_RESERVE:
  467. SATURN_NOPAD:
  468.     clr.b    (a0)                    * アナログ読み込み情報クリア
  469.     moveq.l    #$ff,d0
  470.     bra    IOCS3B_CODE_MODE
  471.  
  472. SATURN_GETDATA:
  473.     move.b    #$d,(a2)                * PC6 = 1
  474.     moveq.l    #$7f,d0
  475. SATURN_GETDATA_1:
  476.     btst.b    #6,(a0)
  477.     dbeq    d0,SATURN_GETDATA_1            * ステータス待ち
  478.     bne    SATURN_EXT_ERROR1            * ケーブル接続エラー
  479.     move.b    (a0),d2                    * データ読み込み
  480.     move.b    #$c,(a2)                * PC6 = 0
  481.     andi.w    #$000f,d2                * 下位4ビットのみ有効
  482.     moveq.l    #$7f,d0
  483. SATURN_GETDATA_2:
  484.     btst.b    #6,(a0)
  485.     dbne    d0,SATURN_GETDATA_2            * ステータス待ち
  486.     beq    SATURN_EXT_ERROR1            * ケーブル接続エラー
  487.     move.b    (a0),d3                    * データ読み込み
  488.     andi.w    #$000f,d3                * 下位4ビットのみ有効
  489.     rts
  490.  
  491. SATURN_EXT_ERROR1:
  492.     addq.w    #4,a7                    * rts分補正
  493.     move.b    #$c,(a2)                * PC6 = 0
  494.     move.b    #9,(a2)                    * PC4 = 1
  495.     move.l    #PAD_TYPE_SS*65536+$0f,d0        * パッドタイプ = SS無接続
  496.     bra    IOCS3B_ERROR
  497. SATURN_EXT_ERROR2:
  498.     move.b    #9,(a2)                    * PC4 = 1
  499.     moveq.l    #$ff,d0                    * パッドタイプ = 不明
  500.     bra    IOCS3B_ERROR
  501. SATURN_EXT_ERROR3:
  502.     move.b    #9,(a2)                    * PC4 = 1
  503.     moveq.l    #2,d0                    * JOYSTICK PORT 1
  504.     bra    ATARI68_1
  505.  
  506. PS_CABLE:
  507.     moveq.l    #$ff,d0                    * パッドタイプ = 不明
  508.     move.w    COM_DATA+COM_JOY1_MAX(pc),d2
  509.     cmpi.w    #JOY_MAX-1,d2
  510.     ble    PS_CABLE_1
  511.     move.w    #JOY_MAX-1,d2
  512. PS_CABLE_1:
  513.     cmp.w    d2,d1
  514.     beq    PS_CABLE_ERROR1                * マルチタップ最大数+1
  515.     bgt    IOCS3B_ERROR                * JOY番号が範囲外か
  516.     move.b    #8,(a2)                    * PC4 = 0
  517.     move.w    d1,d0
  518.     lsl.w    #8,d0
  519.     lea.l    JOY_DATA(pc),a1
  520.     adda.w    d0,a1                    * 対象JOY番号のデータ領域
  521.     lea.l    JOY_RCV_BUF(a1),a4
  522.     moveq.l    #11,d0                    * WAIT TIME
  523.     bsr    JOY_WAIT                * WAIT
  524.     move.w    d1,d2
  525.     addq.w    #1,d2                    * 読み込みパッド位置指定
  526.     bsr    PS_IF_PAD                * 通信
  527.     cmpi.w    #PAD_TYPE_PS,JOY_PAD_TYPE(a1)
  528.     bne    PS_MOTOR_CTRL1                * パッドがPS以外だったか
  529.     cmpi.b    #$0f,JOY_PAD_TYPE+3(a1)
  530.     beq    PS_MOTOR_CTRL1                * パッドが未接続だったか
  531.     move.l    a0,d5                    * A0レジスタ保持
  532.     move.l    d1,d2                    * D1レジスタ保持
  533.     move.l    a5,d3                    * A5レジスタ保持
  534.     clr.l    a5                    * IOCS.X対策
  535.     move.w    sr,d4                    * SRレジスタ保持
  536.     movea.l    $5fc.w,a3
  537.     jsr    (a3)                    * IOCS(ON TIME)
  538.     move.w    d4,sr                    * SRレジスタ復帰
  539.     movea.l    d3,a5                    * A5レジスタ復帰
  540.     move.l    d2,d1                    * D1レジスタ復帰
  541.     movea.l    d5,a0                    * A0レジスタ復帰
  542.     move.l    JOY_PS_MOTOR_TIME(a1),d2
  543.     move.l    d0,JOY_PS_MOTOR_TIME(a1)
  544.     sub.l    d2,d0
  545.     cmpi.l    #200,d0
  546.     bcc    PS_MOTOR_CTRL1                * 2秒以上アクセスがないか
  547.     move.l    JOY_PS_MOTOR_ADR(a1),d0
  548.     bne    PS_MOTOR_CTRL2                * モーターパラメータ転送中か
  549. PS_CABLE_2:
  550.     lea.l    PS_PAD_SND(pc),a3            * パッド読み込みコマンド
  551.     move.w    JOY_MOTOR_STS(a1),d0
  552.     andi.w    #$01ff,d0
  553.     tst.b    JOY_PS_MOTOR_STS(a1)
  554.     bne    PS_CABLE_3                * デュアルショックか
  555.     lsr.w    #8,d0
  556.     ori.w    #$4000,d0
  557. PS_CABLE_3:
  558.     move.w    d0,2(a3)                * 振動ステータスセット
  559. PS_CABLE_10:
  560.     move.b    (a3)+,d2                * コマンド1バイト取り出し
  561.     bsr    PS_IF_PAD                * 通信
  562.     cmpi.b    #$ff,d2
  563.     beq    PS_CABLE_ERROR2
  564.     move.b    d2,d0
  565.     lsr.b    #4,d0
  566.     move.b    d0,(a4)+                * コントローラタイプ
  567.     andi.b    #$0f,d2
  568.     add.b    d2,d2
  569.     move.b    d2,(a4)+                * 転送バイト数
  570.     moveq.l    #0,d4
  571.     move.b    d2,d4
  572. PS_CABLE_11:
  573.     move.b    (a3)+,d2                * コマンド1バイト取り出し
  574.     bsr    PS_IF_PAD                * 通信
  575.     move.b    d2,(a4)+
  576.     dbra    d4,PS_CABLE_11
  577. PS_CABLE_20:
  578.     lea.l    COM_DATA+COM_ANALOG_DATA(pc),a0        * アナログデータ格納エリア
  579.     move.l    #PAD_TYPE_PS*65536,d0
  580.     move.b    #9,(a2)                    * PC4 = 1
  581.     lea.l    JOY_RCV_BUF(a1),a2
  582.     move.b    (a2)+,d0                * コントローラタイプ取得
  583.     move.l    d0,JOY_PAD_TYPE(a1)            * パッドタイプ = PS
  584.     andi.w    #$00ff,d0
  585.     add.w    d0,d0                    * 2倍
  586.     move.w    PS_PADTYPE(pc,d0.w),d0
  587.     jmp    PS_PADTYPE(pc,d0.w)            * タイプ別処理に飛ぶ
  588.  
  589. PS_CABLE_ERROR1:
  590.     moveq.l    #2,d0                    * JOYSTICK PORT 1
  591.     bra    ATARI68_1
  592.  
  593. PS_CABLE_ERROR2:
  594.     move.l    #PAD_TYPE_PS*65536+$0f,d0        * パッドタイプ = PS無接続
  595.     clr.l    JOY_PS_MOTOR_ADR(a1)
  596.     clr.b    JOY_PS_MOTOR_STS(a1)
  597.     move.b    #9,(a2)                    * PC4 = 1
  598.     bra    IOCS3B_ERROR
  599.  
  600. PS_CABLE_ERROR3:
  601.     tst.l    JOY_PS_MOTOR_ADR(a1)
  602.     bne    IOCS3B_CNV_MODE
  603.     move.l    #PS_PAD_SND,JOY_PS_MOTOR_ADR(a1)
  604.     clr.b    JOY_PS_MOTOR_STS(a1)
  605.     bra    IOCS3B_CNV_MODE
  606.  
  607. PS_PADTYPE:
  608.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  609.     .dc.w    PS_MOUSE-PS_PADTYPE            * マウス
  610.     .dc.w    PS_ANALOG1-PS_PADTYPE            * アナログパッド(1STICK)
  611.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  612.     .dc.w    PS_DIGITAL-PS_PADTYPE            * デジタルパッド
  613.     .dc.w    PS_ANALOG2-PS_PADTYPE            * アナログパッド(2STICK)
  614.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  615.     .dc.w    PS_ANALOG2-PS_PADTYPE            * アナログパッド(2STICK)
  616.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  617.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  618.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  619.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  620.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  621.     .dc.w    PS_RESERVE-PS_PADTYPE            * ?
  622.     .dc.w    PS_JOGCON-PS_PADTYPE            * ジョグコン
  623.     .dc.w    PS_UNKNOWPAD-PS_PADTYPE            * その他
  624.  
  625. PS_MOUSE:
  626.     move.b    (a2)+,d4                * サイズ取得
  627.     move.b    (a2)+,d6                * 通信ステータス取得
  628.     bsr    PS_DIGITAL_SET
  629.     subq.b    #2,d4
  630.     beq    IOCS3B_CNV_MODE
  631.     move.b    (a2)+,1(a0)                * 上下移動
  632.     ori.b    #$01,(a0)
  633.     subq.b    #1,d4
  634.     beq    PS_ANALOG2_1
  635.     move.b    (a2)+,2(a0)                * 左右移動
  636.     ori.b    #$02,(a0)
  637.     subq.b    #1,d4
  638. PS_MOUSE_1:
  639.     bsr    PLUS_EMU_SET                * 十字キーエミュレート設定
  640.     cmpi.b    #$5a,d6
  641.     bne    PS_CABLE_ERROR3
  642.     bra    IOCS3B_CNV_MODE
  643.  
  644. PS_ANALOG1:
  645.     move.b    (a2)+,d4                * サイズ取得
  646.     move.b    (a2)+,d6                * 通信ステータス取得
  647.     bsr    PS_DIGITAL_SET
  648.     subq.b    #2,d4
  649.     beq    IOCS3B_CNV_MODE
  650.     move.b    (a2)+,2(a0)                * ねじり
  651.     ori.b    #$02,(a0)
  652.     subq.b    #1,d4
  653.     beq    PS_ANALOG1_1
  654.     move.b    (a2)+,5(a0)                * ボタン1
  655.     ori.b    #$10,(a0)
  656.     subq.b    #1,d4
  657.     beq    PS_ANALOG1_1
  658.     move.b    (a2)+,6(a0)                * ボタン2
  659.     ori.b    #$20,(a0)
  660.     subq.b    #1,d4
  661.     beq    PS_ANALOG1_1
  662.     move.b    (a2)+,7(a0)                * ボタンL
  663.     ori.b    #$40,(a0)
  664.     subq.b    #1,d4
  665. PS_ANALOG1_1:
  666.     bsr    PLUS_EMU_SET                * 十字キーエミュレート設定
  667.     cmpi.b    #$5a,d6
  668.     bne    PS_CABLE_ERROR3
  669.     bra    IOCS3B_CNV_MODE
  670.  
  671. PS_DIGITAL:
  672.     move.b    (a2)+,d4                * サイズ取得
  673.     move.b    (a2)+,d6                * 通信ステータス取得
  674.     bsr    PS_DIGITAL_SET
  675.     cmpi.b    #$5a,d6
  676.     bne    PS_CABLE_ERROR3
  677.     bra    IOCS3B_CNV_MODE
  678.  
  679. PS_ANALOG2:
  680.     move.b    (a2)+,d4                * サイズ取得
  681.     move.b    (a2)+,d6                * 通信ステータス取得
  682.     bsr    PS_DIGITAL_SET
  683.     subq.b    #2,d4
  684.     beq    IOCS3B_CNV_MODE
  685.     move.b    (a2)+,4(a0)                * 右スティック左右
  686.     ori.b    #$08,(a0)
  687.     subq.b    #1,d4
  688.     beq    PS_ANALOG2_1
  689.     move.b    (a2)+,3(a0)                * 右スティック上下
  690.     ori.b    #$04,(a0)
  691.     subq.b    #1,d4
  692.     beq    PS_ANALOG2_1
  693.     move.b    (a2)+,2(a0)                * 左スティック左右
  694.     ori.b    #$02,(a0)
  695.     subq.b    #1,d4
  696.     beq    PS_ANALOG2_1
  697.     move.b    (a2)+,1(a0)                * 左スティック上下
  698.     ori.b    #$01,(a0)
  699.     subq.b    #1,d4
  700. PS_ANALOG2_1:
  701.     bsr    PLUS_EMU_SET                * 十字キーエミュレート設定
  702.     cmpi.b    #$5a,d6
  703.     bne    PS_CABLE_ERROR3
  704.     bra    IOCS3B_CNV_MODE
  705.  
  706. PS_JOGCON:
  707.     move.b    (a2)+,d4                * サイズ取得
  708.     move.b    (a2)+,d6                * 通信ステータス取得
  709.     bsr    PS_DIGITAL_SET
  710.     subq.b    #2,d4
  711.     beq    IOCS3B_CNV_MODE
  712.     move.b    (a2)+,2(a0)                * ジョグ回転値
  713.     ori.b    #$02,(a0)
  714.     subq.b    #1,d4
  715.     beq    PS_JOGCON_1
  716.     move.b    (a2)+,5(a0)                * 右に一回転すると+1、左に一回転すると-1
  717.     ori.b    #$10,(a0)
  718.     subq.b    #1,d4
  719.     beq    PS_JOGCON_1
  720.     move.b    (a2)+,6(a0)                * 右に回転していると1、左に回転していると2、回転無しは0
  721.     ori.b    #$20,(a0)
  722.     subq.b    #1,d4
  723.     beq    PS_JOGCON_1
  724.     move.b    (a2)+,7(a0)                * ?
  725.     ori.b    #$40,(a0)
  726.     subq.b    #1,d4
  727. PS_JOGCON_1:
  728.     bsr    PLUS_EMU_SET                * 十字キーエミュレート設定
  729.     bra    IOCS3B_CNV_MODE
  730.  
  731. PS_UNKNOWPAD:
  732.     clr.b    (a0)                    * アナログ読み込み情報クリア
  733.     move.l    #PAD_TYPE_PS*65536+$04,d0        * パッドタイプ = PSデジタル
  734.     st.b    JOY_PS_MOTOR_STS(a1)            * モータータイプ = デュアルショック
  735.     bra    IOCS3B_ERROR
  736.  
  737. PS_RESERVE:
  738.     clr.b    (a0)                    * アナログ読み込み情報クリア
  739.     moveq.l    #$ff,d0
  740.     bra    IOCS3B_CODE_MODE
  741.  
  742. PS_DIGITAL_SET:
  743.     clr.b    (a0)
  744.     move.b    (a2)+,d2
  745.     lsl.w    #8,d2
  746.     move.b    (a2)+,d2
  747.     moveq.l    #$ff,d0
  748.     lea.l    PSCNV_DATA(pc),a3
  749.     moveq.l    #15,d3
  750. PS_DIGITAL_SET_1:
  751.     btst.l    d3,d2
  752.     bne    PS_DIGITAL_SET_2
  753.     and.w    (a3),d0
  754. PS_DIGITAL_SET_2:
  755.     addq.w    #2,a3
  756.     dbra    d3,PS_DIGITAL_SET_1
  757.     rts
  758.  
  759. PSCNV_DATA:
  760.     .dc.w    $fffb                    * 左変換データ
  761.     .dc.w    $fffd                    * 下変換データ
  762.     .dc.w    $fff7                    * 右変換データ
  763.     .dc.w    $fffe                    * 上変換データ
  764.     .dc.w    $ff7f                    * スタート変換データ
  765.     .dc.w    $dfff                    * 右アナログスティックボタン変換データ
  766.     .dc.w    $bfff                    * 左アナログスティックボタン変換データ
  767.     .dc.w    $7fff                    * セレクト変換データ
  768.     .dc.w    $fbff                    * □変換データ
  769.     .dc.w    $ffbf                    * ×変換データ
  770.     .dc.w    $ffef                    * ○変換データ
  771.     .dc.w    $fdff                    * △変換データ
  772.     .dc.w    $feff                    * R1変換データ
  773.     .dc.w    $f7ff                    * L1変換データ
  774.     .dc.w    $ffdf                    * R2変換データ
  775.     .dc.w    $efff                    * L2変換データ
  776.  
  777. PS_MOTOR_CTRL1:
  778.     lea.l    PS_MOTOR_PARM(pc),a3
  779.     move.l    a3,JOY_PS_MOTOR_ADR(a1)
  780.     clr.b    JOY_PS_MOTOR_STS(a1)
  781.     bra    PS_CABLE_10
  782.  
  783. PS_MOTOR_CTRL2:
  784.     movea.l    d0,a3
  785.     lea.l    32(a3),a3
  786.     tst.b    (a3)
  787.     beq    PS_MOTOR_CTRL2_1
  788.     move.l    a3,JOY_PS_MOTOR_ADR(a1)
  789.     bra    PS_CABLE_10
  790. PS_MOTOR_CTRL2_1:
  791.     clr.l    JOY_PS_MOTOR_ADR(a1)
  792.     bra    PS_CABLE_2
  793.  
  794. *
  795. * 1バイトコマンド転送 & データ取得(コントローラ専用)
  796. *
  797. * IN    D2.B =    コマンド
  798. *    A0.L =    $e9a001
  799. *    A2.L =    $e9a007
  800. *
  801. * OUT    D0.L =    破壊
  802. *    D2.B =    データ
  803. *    D3.L =    破壊
  804. *    D5.w =    破壊
  805. PS_IF_PAD:
  806.     moveq.l    #7,d3                    * CLKカウンタ
  807.     not.b    d2                    * CMD反転
  808.     lsr.b    #1,d2                    * XフラグにCMD
  809.     move.w    sr,d5                    * SRレジスタ保持
  810.     ori.w    #$0700,sr                * 割り込み禁止
  811. PS_IF_PAD_1:
  812.     moveq.l    #7,d0
  813.     roxl.b    #1,d0
  814.     move.b    d0,(a2)                    * CMD書き込み
  815.     move.b    #$d,(a2)                * CLK = 0
  816.     moveq.l    #5,d0                    * WAIT TIME
  817.     bsr    JOY_WAIT                * WAIT
  818.     move.b    #$c,(a2)                * CLK = 1
  819.     moveq.l    #4,d0                    * WAIT TIME
  820.     bsr    JOY_WAIT                * WAIT
  821.     move.b    (a0),d0                    * DAT読み込み
  822.     lsr.b    #1,d0                    * XフラグにDAT
  823.     roxr.b    #1,d2                    * d2にDATをセットして、XフラグにCMD
  824.     dbra    d3,PS_IF_PAD_1
  825.     move.b    #$e,(a2)                * CMD = 1
  826.     move.w    d5,sr                    * SRレジスタ復帰
  827.     moveq.l    #4,d0                    * WAIT TIME
  828.     bsr    JOY_WAIT                * WAIT
  829.     rts
  830.  
  831. JOY_WAIT:
  832.     tst.b    (a0)                    * WAIT
  833.     dbra    d0,JOY_WAIT
  834.     rts
  835.  
  836. MD_MTAP_ERROR1:
  837.     moveq.l    #2,d0                    * JOYSTICK PORT 1
  838.     bra    ATARI68_1
  839.  
  840. MD_MTAP:
  841.     moveq.l    #$ff,d0                    * パッドタイプ = 不明
  842.     move.w    COM_DATA+COM_JOY1_MAX(pc),d2
  843.     cmpi.w    #4,d2
  844.     ble    MD_MTAP_1
  845.     move.w    #4,d2
  846. MD_MTAP_1:
  847.     cmp.w    d2,d1
  848.     beq    MD_MTAP_ERROR1
  849.     bgt    IOCS3B_ERROR                * ジョイスティック番号が範囲外か?
  850.     move.l    #PAD_TYPE_MD*65536+PAD_TYPE_MTAP,d6    * パッドタイプ = メガドライブ + マルチタップ
  851.     move.w    d1,d0
  852.     lsl.w    #8,d0
  853.     lea.l    JOY_DATA(pc),a1
  854.     adda.w    d0,a1                    * 対象JOY番号のデータ領域
  855.     cmpi.w    #1,COM_DATA+COM_HANTEI_MODE
  856.     beq    MD_MTAP_2                * キャッシュ無し指定か
  857.     move.l    JOY_PAD_TYPE(a1),d0
  858.     clr.b    d0
  859.     cmp.l    d6,d0
  860.     bne    MD_MTAP_2                * 前回がメガドライブマルチタップ以外か
  861.     tst.b    JOY_CACHE_STS(a1)
  862.     bne    MD_MTAP_6                * キャッシュされているデータがあるか
  863. MD_MTAP_2:
  864.     move.b    #8,(a2)                    * PC4 = 0
  865.     lea.l    JOY_DATA+JOY_RCV_BUF(pc),a3
  866.     lea.l    MD_DATA_SIZE(pc),a4            * PORT SIZE DATA ADR
  867.     moveq.l    #0,d5                    * s_work
  868.     bsr    MD_GET_DATA                * DUMMY_GET
  869.     bsr    MD_GET_DATA                * DUMMY_GET
  870.     bsr    MD_GET_DATA                * DUMMY_GET
  871.     bsr    MD_GET_DATA                * GET PORT TYPE A
  872.     move.b    d0,(a3)                    * コントローラタイプ
  873.     move.b    0(a4,d0.w),1(a3)            * PORT A SIZE
  874.     lea.l    DATA_SIZE(a3),a3            * 次のジョイスティックのデータ領域
  875.     bsr    MD_GET_DATA                * GET PORT TYPE B
  876.     move.b    d0,(a3)                    * コントローラタイプ
  877.     move.b    0(a4,d0.w),1(a3)            * PORT B SIZE
  878.     lea.l    DATA_SIZE(a3),a3            * 次のジョイスティックのデータ領域
  879.     bsr    MD_GET_DATA                * GET PORT TYPE C
  880.     move.b    d0,(a3)                    * コントローラタイプ
  881.     move.b    0(a4,d0.w),1(a3)            * PORT C SIZE
  882.     lea.l    DATA_SIZE(a3),a3            * 次のジョイスティックのデータ領域
  883.     bsr    MD_GET_DATA                * GET PORT TYPE D
  884.     move.b    d0,(a3)                    * コントローラタイプ
  885.     move.b    0(a4,d0.w),1(a3)            * PORT D SIZE
  886.     lea.l    JOY_DATA(pc),a3
  887.     moveq.l    #3,d4                    * ループ回数-1
  888. MD_MTAP_3:
  889.     lea.l    JOY_RCV_BUF(a3),a4
  890.     move.b    (a4)+,d6
  891.     move.l    d6,JOY_PAD_TYPE(a3)            * コントローラタイプ
  892.     moveq.l    #0,d3
  893.     move.b    (a4)+,d3
  894.     beq    MD_MTAP_5
  895.     subq.w    #1,d3
  896. MD_MTAP_4:
  897.     bsr    MD_GET_DATA                * GET DATA
  898.     move.b    d0,(a4)+                * データ書き込み
  899.     dbra    d3,MD_MTAP_4
  900. MD_MTAP_5:
  901.     st.b    JOY_CACHE_STS(a3)            * キャッシュデータ有りにする
  902.     lea.l    DATA_SIZE(a3),a3            * 次のジョイスティックのデータ領域
  903.     dbra    d4,MD_MTAP_3
  904.     move.b    #14,(a2)                * PC7 = 0
  905.     move.b    #9,(a2)                    * PC4 = 1
  906. MD_MTAP_6:
  907.     clr.b    JOY_CACHE_STS(a1)            * キャッシュデータ無しにする
  908.     lea.l    COM_DATA+COM_ANALOG_DATA(pc),a0        * アナログデータ格納エリア
  909.     lea.l    JOY_RCV_BUF(a1),a2
  910.     moveq.l    #0,d0
  911.     move.b    (a2)+,d0                * コントローラタイプ取得
  912.     add.w    d0,d0                    * 2倍
  913.     move.w    MD_PADTYPE(pc,d0.w),d0
  914.     jmp    MD_PADTYPE(pc,d0.w)            * タイプ別処理に飛ぶ
  915.  
  916. MD_PADTYPE:
  917.     .dc.w    MD_3BUTTON-MD_PADTYPE            * 3ボタン
  918.     .dc.w    MD_6BUTTON-MD_PADTYPE            * 6ボタン
  919.     .dc.w    MD_MOUSE-MD_PADTYPE            * マウス
  920.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  921.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  922.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  923.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  924.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  925.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  926.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  927.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  928.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  929.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  930.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  931.     .dc.w    MD_RESERVE-MD_PADTYPE            * ?
  932.     .dc.w    MD_NOPAD-MD_PADTYPE            * 未接続
  933.  
  934. MD_3BUTTON:
  935.     clr.b    (a0)
  936.     tst.b    (a2)+                    * サイズ分読み飛ばし
  937.     moveq.l    #$ff,d0
  938.     move.b    (a2)+,d0
  939.     move.b    (a2),d2
  940.     lsl.b    #4,d2
  941.     or.b    d2,d0
  942.     bra    IOCS3B_CNV_MODE
  943.  
  944. MD_6BUTTON:
  945.     clr.b    (a0)
  946.     tst.b    (a2)+                    * サイズ分読み飛ばし
  947.     moveq.l    #$ff,d0
  948.     move.b    (a2)+,d2
  949.     move.b    (a2)+,d3
  950.     move.b    (a2),d0
  951.     ori.b    #$f0,d0
  952.     lsl.w    #8,d0
  953.     lsl.b    #4,d3
  954.     or.b    d3,d2
  955.     move.b    d2,d0
  956.     bra    IOCS3B_CNV_MODE
  957.  
  958. MD_MOUSE:
  959. MD_RESERVE:
  960. MD_NOPAD:
  961.     clr.b    (a0)                    * アナログ読み込み情報クリア
  962.     moveq.l    #$ff,d0
  963.     bra    IOCS3B_CODE_MODE
  964.  
  965. MD_GET_DATA:
  966.     tst.b    d5
  967.     bne    MD_GET_DATA_3
  968.     move.b    #14,(a2)                * PC7 = 0
  969.     moveq.l    #$7f,d0
  970. MD_GET_DATA_1:
  971.     btst.b    #5,(a0)                    * PA5 == 1 ?
  972.     dbne    d0,MD_GET_DATA_1
  973.     beq    MD_MTAP_ERROR2                * 接続エラー
  974.     move.b    (a0),d0                    * GET_DATA
  975.     move.b    #15,(a2)                * PC7 = 1
  976.     moveq.l    #$7f,d2
  977. MD_GET_DATA_2:
  978.     btst.b    #5,(a0)                    * PA5 == 0 ?
  979.     dbeq    d2,MD_GET_DATA_2
  980.     bne    MD_MTAP_ERROR2                * 接続エラー
  981.     move.b    (a0),d2                    * GET_DATA
  982.     moveq.l    #1,d5
  983.     bra    MD_GET_DATA_4
  984. MD_GET_DATA_3:
  985.     move.b    d2,d0
  986.     moveq.l    #0,d5                    * s_work
  987. MD_GET_DATA_4:
  988.     andi.w    #$000f,d0
  989.     rts
  990.  
  991. MD_MTAP_ERROR2:
  992.     addq.w    #4,a7                    * rts分補正
  993.     move.b    #14,(a2)                * PC7 = 0
  994.     move.b    #9,(a2)                    * PC4 = 1
  995.     move.l    #PAD_TYPE_MD*65536+$0f,d0        * パッドタイプ = メガドライブ無接続
  996.     bra    IOCS3B_ERROR
  997.  
  998. MD_DATA_SIZE:
  999.     .dc.b    2                    * 3ボタン
  1000.     .dc.b    3                    * 6ボタン
  1001.     .dc.b    6                    * セガマウス
  1002.     .dc.b    0                    * 無し
  1003.     .dc.b    0                    * 無し
  1004.     .dc.b    0                    * 無し
  1005.     .dc.b    0                    * 無し
  1006.     .dc.b    0                    * 無し
  1007.     .dc.b    0                    * 無し
  1008.     .dc.b    0                    * 無し
  1009.     .dc.b    0                    * 無し
  1010.     .dc.b    0                    * 無し
  1011.     .dc.b    0                    * 無し
  1012.     .dc.b    0                    * 無し
  1013.     .dc.b    0                    * 無し
  1014.     .dc.b    0                    * 未接続
  1015.  
  1016. COM_DATA:
  1017.     COM_DATA_INIT                    * 共通データ
  1018. JOY_DATA:
  1019.     JOY_DATA_INIT
  1020.     JOY_DATA_INIT
  1021.     JOY_DATA_INIT
  1022.     JOY_DATA_INIT
  1023.     JOY_DATA_INIT
  1024.     JOY_DATA_INIT
  1025.     JOY_DATA_INIT
  1026.  
  1027. PS_PAD_SND:
  1028.     .dc.b    $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1029.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1030. PS_MOTOR_PARM:
  1031.     .dc.b    $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1032.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1033.  
  1034.     .dc.b    $43,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1035.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1036.  
  1037.     .dc.b    $45,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1038.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1039.  
  1040.     .dc.b    $4c,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1041.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1042.  
  1043.     .dc.b    $47,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1044.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1045.  
  1046.     .dc.b    $4c,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1047.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1048.  
  1049.     .dc.b    $4c,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1050.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1051.  
  1052.     .dc.b    $45,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1053.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1054.  
  1055.     .dc.b    $45,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1056.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1057.  
  1058.     .dc.b    $47,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1059.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1060.  
  1061.     .dc.b    $43,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1062.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1063.  
  1064.     .dc.b    $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1065.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1066.  
  1067.     .dc.b    $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1068.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1069.  
  1070.     .dc.b    $43,$00,$01,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1071.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1072.  
  1073.     .dc.b    $4d,$00,$00,$01,$ff,$ff,$ff,$ff,$00,$00,$00,$00,$00,$00,$00,$00
  1074.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1075.  
  1076.     .dc.b    $43,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1077.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1078.  
  1079.     .dc.b    $42,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1080.     .dc.b    $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
  1081.  
  1082.     .dc.b    $00,$00
  1083.  
  1084. .even
  1085. MODECNV_RTN:
  1086.     cmpi.w    #$23,d2
  1087.     bcc    MODECNV_RTN_1                * モード指定が範囲外か?
  1088.     move.w    d2,d0
  1089.     add.w    d0,d0                    * 2倍
  1090.     move.w    MODECNV_TBL(pc,d0.w),d0
  1091.     jmp    MODECNV_TBL(pc,d0.w)            * 各モード指定に飛ぶ
  1092. MODECNV_RTN_1:
  1093.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1094.     rts
  1095.  
  1096. MODECNV_TBL:
  1097.     .dc.w    DRV_INITEND-MODECNV_TBL            * ドライバ初期化/終了処理
  1098.     .dc.w    JOYDRV_KEEP_STS-MODECNV_TBL        * 常駐状態取得
  1099.     .dc.w    GET_BUF_ADR-MODECNV_TBL            * 内部データアドレス取得
  1100.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1101.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1102.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1103.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1104.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1105.     .dc.w    ANALOG_GET-MODECNV_TBL            * アナログパッド読み込み
  1106.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1107.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1108.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1109.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1110.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1111.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1112.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1113.     .dc.w    MULTI_STS-MODECNV_TBL            * マルチタップ判定モード設定/取得
  1114.     .dc.w    CNVMODE_STS-MODECNV_TBL            * ビット変換モード設定/取得
  1115.     .dc.w    CNVDATA_STS-MODECNV_TBL            * ビット変換データ設定/取得
  1116.     .dc.w    OUTPUT_STS-MODECNV_TBL            * 出力モード設定/取得
  1117.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1118.     .dc.w    MTAP_MAX_SET-MODECNV_TBL        * マルチタップ・パッド接続数設定
  1119.     .dc.w    PLUS_EMULATION-MODECNV_TBL        * アナログスティック・エミュレート設定
  1120.     .dc.w    PEM_PNT_SET-MODECNV_TBL            * 十字キーエミュレートしきい値設定
  1121.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1122.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1123.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1124.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1125.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1126.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1127.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1128.     .dc.w    MODECNV_RTN_1-MODECNV_TBL        * 予備
  1129.     .dc.w    PS_MEMBREAD-MODECNV_TBL            * プレイステーションメモリカード読み込み
  1130.     .dc.w    PS_MEMBWRITE-MODECNV_TBL        * プレイステーションメモリカード書き込み
  1131.     .dc.w    PS_MOTOR-MODECNV_TBL            * プレイステーション振動パッド制御
  1132.  
  1133. * $00~$0F    システム関連
  1134. * $10~$1F    設定関連
  1135. * $20~$2F    特殊コール(プレイステーション関連)
  1136. * $30~$3F    特殊コール(サターン関連)
  1137.  
  1138. DRV_INITEND:
  1139.     moveq.l    #0,d0
  1140.     movea.l    #$e9a007,a0
  1141.     move.b    #$c,(a0)
  1142.     move.b    #$e,(a0)
  1143.     tst.w    d3
  1144.     bne    DRV_INITEND_1
  1145.     move.b    #$9,(a0)
  1146.     move.b    #$b,(a0)
  1147.     rts
  1148. DRV_INITEND_1:
  1149.     move.b    #$8,(a0)
  1150.     move.b    #$a,(a0)
  1151.     rts
  1152.  
  1153. JOYDRV_KEEP_STS:
  1154.     lea.l    KEEP_CHK_NAME(pc),a0
  1155.     move.l    a0,d0                    * JOYDRVは常駐している
  1156.     rts
  1157.  
  1158. GET_BUF_ADR:
  1159.     cmpi.w    #JOY_MAX,d3
  1160.     bcc    GET_BUF_ADR_1                * ジョイスティック番号が範囲外か?
  1161.     move.w    d3,d0
  1162.     lsl.w    #8,d0
  1163.     lea.l    JOY_DATA(pc),a1
  1164.     adda.w    d0,a1
  1165.     moveq.l    #0,d0
  1166.     rts
  1167. GET_BUF_ADR_1:
  1168.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1169.     rts
  1170.  
  1171. MULTI_STS:
  1172.     tst.w    d3
  1173.     bmi    MULTI_STS_1                * 状態取得か?
  1174.     cmpi.w    #3,d3
  1175.     bcc    MULTI_STS_2                * 設定値が範囲外か?
  1176.     lea.l    COM_DATA+COM_HANTEI_MODE(pc),a0
  1177.     move.w    d3,(a0)                    * マルチタップ判定モード設定
  1178.     moveq.l    #0,d0                    * 正常終了
  1179.     rts
  1180. MULTI_STS_1:
  1181.     move.w    COM_DATA+COM_HANTEI_MODE(pc),d0        * マルチタップ判定モード取得
  1182.     rts
  1183. MULTI_STS_2:
  1184.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1185.     rts
  1186.  
  1187. CNVMODE_STS:
  1188.     cmpi.w    #JOY_MAX,d4
  1189.     bcc    CNVMODE_STS_1                * ジョイスティック番号が範囲外か?
  1190.     move.w    d4,d0
  1191.     lsl.w    #8,d0
  1192.     lea.l    JOY_DATA+JOY_CNV_MODE(pc),a0
  1193.     adda.w    d0,a0
  1194.     tst.w    d3
  1195.     bmi    CNVMODE_STS_2                * 状態取得か?
  1196.     cmpi.w    #2,d3
  1197.     bcc    CNVMODE_STS_3                * 設定値が範囲外か?
  1198.     move.w    d3,(a0)                    * ビット変換モード設定
  1199.     moveq.l    #0,d0                    * 正常終了
  1200.     rts
  1201. CNVMODE_STS_1:
  1202.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1203.     rts
  1204. CNVMODE_STS_2:
  1205.     move.w    (a0),d0                    * ビット変換モード取得
  1206.     rts
  1207. CNVMODE_STS_3:
  1208.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1209.     rts
  1210.  
  1211. CNVDATA_STS:
  1212.     cmpi.w    #JOY_MAX,d4
  1213.     bcc    CNVDATA_STS_2                * ジョイスティック番号が範囲外か?
  1214.     move.l    a1,-(a7)                * レジスタ保存
  1215.     move.w    d4,d0
  1216.     lsl.w    #8,d0
  1217.     lea.l    JOY_DATA+JOY_CNV_DATA(pc),a0
  1218.     adda.w    d0,a0
  1219.     tst.w    d3
  1220.     bpl    CNVDATA_STS_1                * 状態取得か?
  1221.     exg.l    a1,a0
  1222. CNVDATA_STS_1:
  1223.     move.l    (a1)+,(a0)+
  1224.     move.l    (a1)+,(a0)+
  1225.     move.l    (a1)+,(a0)+
  1226.     move.l    (a1)+,(a0)+
  1227.     move.l    (a1)+,(a0)+
  1228.     move.l    (a1)+,(a0)+
  1229.     move.l    (a1)+,(a0)+
  1230.     move.l    (a1),(a0)                * 32バイト転送
  1231.     movea.l    (a7)+,a1                * レジスタ復帰
  1232.     moveq.l    #0,d0                    * 正常終了
  1233.     rts
  1234. CNVDATA_STS_2:
  1235.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1236.     rts
  1237.  
  1238. OUTPUT_STS:
  1239.     tst.w    d3
  1240.     bmi    OUTPUT_STS_1                * 状態取得か?
  1241.     cmpi.w    #2,d3
  1242.     bcc    OUTPUT_STS_2                * 設定値が範囲外か?
  1243.     lea.l    COM_DATA+COM_IOCS3B_OUT(pc),a0
  1244.     move.w    d3,(a0)                    * 出力モード設定
  1245.     moveq.l    #0,d0                    * 正常終了
  1246.     rts
  1247. OUTPUT_STS_1:
  1248.     move.w    COM_DATA+COM_IOCS3B_OUT(pc),d0        * 出力モード取得
  1249.     rts
  1250. OUTPUT_STS_2:
  1251.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1252.     rts
  1253.  
  1254. MTAP_MAX_SET:
  1255.     tst.w    d3
  1256.     bmi    MTAP_MAX_SET_2                * 状態取得か?
  1257.     move.w    d3,d0
  1258.     cmpi.w    #JOY_MAX-1,d0                * タップ数がドライバの管理する範囲外か?
  1259.     bls    MTAP_MAX_SET_1
  1260.     move.w    #JOY_MAX-1,d0
  1261. MTAP_MAX_SET_1:
  1262.     lea.l    COM_DATA+COM_JOY1_MAX(pc),a0
  1263.     move.w    d0,(a0)                    * パッド数設定
  1264.     moveq.l    #0,d0                    * 正常終了
  1265.     rts
  1266. MTAP_MAX_SET_2:
  1267.     move.w    COM_DATA+COM_JOY1_MAX(pc),d0        * パッド数取得
  1268.     rts
  1269.  
  1270. PLUS_EMULATION:
  1271.     cmpi.w    #JOY_MAX,d4
  1272.     bcc    PLUS_EMULATION_2            * ジョイスティック番号が範囲外か?
  1273.     move.w    d4,d0
  1274.     lsl.w    #8,d0
  1275.     lea.l    JOY_DATA+JOY_PLUS_EMU(pc),a0
  1276.     adda.w    d0,a0
  1277.     tst.w    d3
  1278.     bmi    PLUS_EMULATION_1            * 状態取得か?
  1279.     move.w    d3,(a0)                    * エミュレート設定
  1280.     moveq.l    #0,d0                    * 正常終了
  1281.     rts
  1282. PLUS_EMULATION_1:
  1283.     move.w    (a0),d0                    * エミュレート設定取得
  1284.     rts
  1285. PLUS_EMULATION_2:
  1286.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1287.     rts
  1288.  
  1289. PEM_PNT_SET:
  1290.     cmpi.w    #JOY_MAX,d4
  1291.     bcc    PEM_PNT_SET_3                * ジョイスティック番号が範囲外か?
  1292.     move.w    d4,d0
  1293.     lsl.w    #8,d0
  1294.     lea.l    JOY_DATA+JOY_PLUS_EMU+2(pc),a0
  1295.     adda.w    d0,a0
  1296.     tst.w    d3
  1297.     bmi    PEM_PNT_SET_1                * 状態取得か?
  1298.     cmpi.w    #$7f,d3
  1299.     bhi    PEM_PNT_SET_2                * 設定値が範囲外か?
  1300.     move.w    d3,(a0)                    * エミュレートしきい値設定
  1301.     moveq.l    #0,d0                    * 正常終了
  1302.     rts
  1303. PEM_PNT_SET_1:
  1304.     move.w    (a0),d0                    * エミュレートしきい値取得
  1305.     rts
  1306. PEM_PNT_SET_2:
  1307.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1308.     rts
  1309. PEM_PNT_SET_3:
  1310.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1311.     rts
  1312.  
  1313. PS_MEMBREAD:
  1314.     movem.l    d1-d7/a1-a2,-(a7)            * レジスタ保存
  1315.     bsr    CHECK_PSCABLE
  1316.     tst.b    d0
  1317.     bmi    PS_MEMBREAD_10
  1318. PS_MEMBREAD_1:
  1319.     bsr    PS_MEMFREAD                * 1フレーム読み込み
  1320.     tst.l    d0
  1321.     bmi    PS_MEMBREAD_2                * $fb .. メモリカード未接続  $fa .. 読み込みエラー
  1322.     move.w    #100,d0                    * WAIT TIME
  1323.     bsr    JOY_WAIT                * WAIT
  1324.     addq.w    #1,d4
  1325.     dbra    d5,PS_MEMBREAD_1
  1326.     moveq.l    #0,d0
  1327. PS_MEMBREAD_2:
  1328.     movem.l    (a7)+,d1-d7/a1-a2            * レジスタ復帰
  1329.     rts
  1330.  
  1331. PS_MEMBREAD_10:
  1332.     moveq.l    #$fc,d0                    * PSケーブルが接続されていない
  1333.     bra    PS_MEMBREAD_2
  1334.  
  1335. PS_MEMFREAD:
  1336.     move.b    #8,(a2)                    * PC4 = 0
  1337.     moveq.l    #$2f,d0                    * WAIT TIME
  1338.     bsr    JOY_WAIT                * WAIT
  1339.     move.w    d3,d1
  1340.     addi.w    #$0081,d1                * 読み込みメモリカード位置指定
  1341.     bsr    PS_IF                    * 通信
  1342.     moveq.l    #$52,d1                    * CMD 52
  1343.     bsr    PS_IF                    * 通信
  1344.     moveq.l    #$00,d1                    * CMD 00
  1345.     bsr    PS_IF                    * 通信
  1346.     cmpi.b    #$5a,d0
  1347.     bne    PS_MEMFREAD_10
  1348.     moveq.l    #$00,d1                    * CMD 00
  1349.     bsr    PS_IF                    * 通信
  1350.     move.w    d4,d1
  1351.     lsr.w    #8,d1                    * アドレス上位
  1352.     bsr    PS_IF                    * 通信
  1353.     move.b    d4,d1                    * アドレス下位
  1354.     bsr    PS_IF                    * 通信
  1355.     moveq.l    #$00,d1                    * CMD 00
  1356.     bsr    PS_IF                    * 通信
  1357.     moveq.l    #$00,d1                    * CMD 00
  1358.     bsr    PS_IF                    * 通信
  1359.     moveq.l    #$00,d1                    * CMD 00
  1360.     bsr    PS_IF                    * 通信
  1361.     move.b    d0,d7
  1362.     moveq.l    #$00,d1                    * CMD 00
  1363.     bsr    PS_IF                    * 通信
  1364.     eor.b    d0,d7
  1365.     move.l    d5,-(a7)                * レジスタ保存
  1366.     moveq.l    #$7f,d5                    * 1フレームバイト数-1
  1367. PS_MEMFREAD_1:
  1368.     moveq.l    #$00,d1                    * CMD 00
  1369.     bsr    PS_IF                    * 通信
  1370.     move.b    d0,(a1)+
  1371.     eor.b    d0,d7
  1372.     dbra    d5,PS_MEMFREAD_1
  1373.     move.l    (a7)+,d5                * レジスタ復帰
  1374.     moveq.l    #$00,d1                    * CMD 00
  1375.     bsr    PS_IF                    * 通信
  1376.     eor.b    d0,d7
  1377.     moveq.l    #$00,d1                    * CMD 00
  1378.     bsr    PS_IF                    * 通信
  1379.     tst.b    d7
  1380.     bne    PS_MEMFREAD_11
  1381.     moveq.l    #0,d0                    * 正常終了
  1382. PS_MEMFREAD_2:
  1383.     move.b    #9,(a2)                    * PC4 = 1
  1384.     rts
  1385.  
  1386. PS_MEMFREAD_10:
  1387.     moveq.l    #$fb,d0                    * メモリカード未接続
  1388.     bra    PS_MEMFREAD_2
  1389.  
  1390. PS_MEMFREAD_11:
  1391.     moveq.l    #$fa,d0                    * 読み込みエラー
  1392.     bra    PS_MEMFREAD_2
  1393.  
  1394. *
  1395. * 1バイトコマンド転送 & データ取得
  1396. *
  1397. * IN    D1.B =    コマンド
  1398. *    D6.W =  WAIT TIME
  1399. *    A0.L =    $e9a001
  1400. *    A2.L =    $e9a007
  1401. *
  1402. * OUT    D0.B =    データ
  1403. *    D1.L =    破壊
  1404. *    D2.L =    破壊
  1405. PS_IF:
  1406.     moveq.l    #7,d2                    * CLKカウンタ
  1407.     not.b    d1                    * CMD反転
  1408.     lsr.b    #1,d1                    * XフラグにCMD
  1409.     move.w    sr,-(a7)
  1410.     ori.w    #$0700,sr                * 割り込み禁止
  1411. PS_IF_1:
  1412.     moveq.l    #7,d0
  1413.     roxl.b    #1,d0
  1414.     move.b    #$d,(a2)                * CLK = 0
  1415.     move.b    d0,(a2)                    * CMD書き込み
  1416.     moveq.l    #$2f,d0                    * WAIT TIME
  1417.     bsr    JOY_WAIT                * WAIT
  1418.     move.b    #$c,(a2)                * CLK = 1
  1419.     moveq.l    #$2f,d0                    * WAIT TIME
  1420.     bsr    JOY_WAIT                * WAIT
  1421.     move.b    (a0),d0                    * DAT読み込み
  1422.     lsr.b    #1,d0                    * XフラグにDAT
  1423.     roxr.b    #1,d1                    * d1にDATをセットして、XフラグにCMD
  1424.     dbra    d2,PS_IF_1
  1425.     move.b    #$e,(a2)                * CMD = 1
  1426.     move.w    (a7)+,sr
  1427.     moveq.l    #$2f,d0                    * WAIT TIME
  1428.     bsr    JOY_WAIT                * WAIT
  1429.     move.b    d1,d0
  1430.     rts
  1431.  
  1432. PS_MEMBWRITE:
  1433.     movem.l    d1-d7/a1-a2,-(a7)            * レジスタ保存
  1434.     bsr    CHECK_PSCABLE
  1435.     tst.b    d0
  1436.     bmi    PS_MEMBWRITE_10
  1437. PS_MEMBWRITE_1:
  1438.     bsr    PS_MEMFWRITE                * 1フレーム書き込み
  1439.     tst.l    d0
  1440.     bmi    PS_MEMBWRITE_2                * $fb .. メモリカード未接続  $f9 .. 書き込みエラー
  1441.     move.w    #8900,d0                * WAIT TIME
  1442.     bsr    JOY_WAIT                * WAIT
  1443.     addq.w    #1,d4
  1444.     dbra    d5,PS_MEMBWRITE_1
  1445.     moveq.l    #0,d0
  1446. PS_MEMBWRITE_2:
  1447.     movem.l    (a7)+,d1-d7/a1-a2            * レジスタ復帰
  1448.     rts
  1449.  
  1450. PS_MEMBWRITE_10:
  1451.     moveq.l    #$fc,d0                    * PSケーブルが接続されていない
  1452.     bra    PS_MEMBWRITE_2
  1453.  
  1454. PS_MEMFWRITE:
  1455.     move.b    #8,(a2)                    * PC4 = 0
  1456.     moveq.l    #$3f,d0                    * WAIT TIME
  1457.     bsr    JOY_WAIT                * WAIT
  1458.     move.w    d3,d1
  1459.     addi.w    #$0081,d1                * 書き込みメモリカード位置指定
  1460.     bsr    PS_IF2                    * 通信
  1461.     moveq.l    #$57,d1                    * CMD 57
  1462.     bsr    PS_IF2                    * 通信
  1463.     moveq.l    #$00,d1                    * CMD 00
  1464.     bsr    PS_IF2                    * 通信
  1465.     cmpi.b    #$5a,d0
  1466.     bne    PS_MEMFWRITE_10
  1467.     moveq.l    #$00,d1                    * CMD 00
  1468.     bsr    PS_IF2                    * 通信
  1469.     move.w    d4,d1
  1470.     lsr.w    #8,d1                    * アドレス上位
  1471.     move.b    d1,d7
  1472.     bsr    PS_IF2                    * 通信
  1473.     move.b    d4,d1                    * アドレス下位
  1474.     eor.b    d1,d7
  1475.     bsr    PS_IF2                    * 通信
  1476.     move.l    d5,-(a7)                * レジスタ保存
  1477.     moveq.l    #$7f,d5                    * 1フレームバイト数-1
  1478. PS_MEMFWRITE_1:
  1479.     move.b    (a1)+,d1                * 書き込みデータ
  1480.     eor.b    d1,d7
  1481.     bsr    PS_IF2                    * 通信
  1482.     dbra    d5,PS_MEMFWRITE_1
  1483.     move.l    (a7)+,d5                * レジスタ復帰
  1484.     move.b    d7,d1                    * XORフラグ
  1485.     bsr    PS_IF2                    * 通信
  1486.     moveq.l    #$00,d1                    * CMD 00
  1487.     bsr    PS_IF2                    * 通信
  1488.     moveq.l    #$00,d1                    * CMD 00
  1489.     bsr    PS_IF2                    * 通信
  1490.     moveq.l    #$00,d1                    * CMD 00
  1491.     bsr    PS_IF2                    * 通信
  1492.     cmpi.b    #$47,d0
  1493.     bne    PS_MEMFWRITE_11
  1494.     moveq.l    #0,d0                    * 正常終了
  1495. PS_MEMFWRITE_2:
  1496.     move.b    #9,(a2)                    * PC4 = 1
  1497.     rts
  1498.  
  1499. PS_MEMFWRITE_10:
  1500.     moveq.l    #$fb,d0                    * メモリカード未接続
  1501.     bra    PS_MEMFWRITE_2
  1502.  
  1503. PS_MEMFWRITE_11:
  1504.     moveq.l    #$f9,d0                    * 書き込みエラー
  1505.     bra    PS_MEMFWRITE_2
  1506.  
  1507. CHECK_PSCABLE:
  1508.     lea.l    $e9a001,a0                * ジョイスティックI/Oアドレス
  1509.     lea.l    6(a0),a2                * ジョイスティックI/Oアドレス
  1510.     move.b    #9,(a2)                    * ON
  1511.     tst.b    (a0)
  1512.     move.b    (a0),d0
  1513.     andi.b    #$0f,d0
  1514.     cmpi.b    #2,d0
  1515.     sne    d0
  1516.     rts
  1517.  
  1518. *
  1519. * 1バイトコマンド転送 & データ取得
  1520. *
  1521. * IN    D1.B =    コマンド
  1522. *    D6.W =  WAIT TIME
  1523. *    A0.L =    $e9a001
  1524. *    A2.L =    $e9a007
  1525. *
  1526. * OUT    D0.B =    データ
  1527. *    D1.L =    破壊
  1528. *    D2.L =    破壊
  1529. PS_IF2:
  1530.     moveq.l    #7,d2                    * CLKカウンタ
  1531.     not.b    d1                    * CMD反転
  1532.     lsr.b    #1,d1                    * XフラグにCMD
  1533.     move.w    sr,-(a7)
  1534.     ori.w    #$0700,sr                * 割り込み禁止
  1535. PS_IF2_1:
  1536.     moveq.l    #7,d0
  1537.     roxl.b    #1,d0
  1538.     move.b    d0,(a2)                    * CMD書き込み
  1539.     move.b    #$d,(a2)                * CLK = 0
  1540.     moveq.l    #$3f,d0                    * WAIT TIME
  1541.     bsr    JOY_WAIT                * WAIT
  1542.     move.b    #$c,(a2)                * CLK = 1
  1543.     move.b    (a0),d0                    * DAT読み込み
  1544.     lsr.b    #1,d0                    * XフラグにDAT
  1545.     roxr.b    #1,d1                    * d1にDATをセットして、XフラグにCMD
  1546.     moveq.l    #$3f,d0                    * WAIT TIME
  1547.     bsr    JOY_WAIT                * WAIT
  1548.     dbra    d2,PS_IF2_1
  1549.     move.b    #$0e,(a2)                * CMD(1)書き込み
  1550.     move.w    (a7)+,sr
  1551.     move.b    d1,d0
  1552.     rts
  1553.  
  1554. PS_MOTOR:
  1555.     cmpi.w    #JOY_MAX,d3
  1556.     bcc    PS_MOTOR_10                * ジョイスティック番号が範囲外か?
  1557.     move.w    d3,d0
  1558.     lsl.w    #8,d0
  1559.     lea.l    JOY_DATA(pc),a0
  1560.     adda.w    d0,a0
  1561.     btst.l    #0,d4
  1562.     sne.b    JOY_MOTOR_STS(a0)
  1563.     move.b    d5,d0
  1564.     btst.l    #1,d4
  1565.     bne    PS_MOTOR_1
  1566.     moveq.l    #0,d0
  1567. PS_MOTOR_1:
  1568.     move.b    d0,JOY_MOTOR_STS+1(a0)
  1569.     moveq.l    #0,d0                    * 正常終了
  1570.     rts
  1571. PS_MOTOR_10:
  1572.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1573.     rts
  1574.  
  1575. ANALOG_GET:
  1576.     movem.l    d1/a1,-(a7)                * レジスタ保存
  1577.     tst.w    d3
  1578.     bmi    ANALOG_GET_2                * ジョイスティック番号が範囲外か?
  1579.     move.w    d3,d1
  1580.     bsr    IOCS3B                    * ジョイスティック読み込み
  1581.     move.w    d0,(a1)+                * デジタルデータ格納
  1582.     lea.l    COM_DATA+COM_ANALOG_DATA(pc),a0
  1583.     move.l    (a0)+,(a1)+                * アナログデータコピー
  1584.     move.l    (a0)+,(a1)+
  1585.     move.b    (a0),(a1)
  1586.     tst.l    d0
  1587.     beq    ANALOG_GET_2                * ジョイスティック番号が範囲外か?
  1588.     move.w    d1,d0
  1589.     lsl.w    #8,d0
  1590.     lea.l    JOY_DATA(pc),a0
  1591.     adda.w    d0,a0
  1592.     move.l    JOY_PAD_TYPE(a0),d0
  1593. ANALOG_GET_1:
  1594.     movem.l    (a7)+,d1/a1                * レジスタ保存
  1595.     rts
  1596. ANALOG_GET_2:
  1597.     moveq.l    #$fe,d0                    * ジョイスティック番号が範囲外
  1598.     bra    ANALOG_GET_1
  1599.  
  1600. IOCSF2:
  1601.     cmpi.w    #$3,d1
  1602.     bcc    IOCSF2_1                * モード指定が範囲外か?
  1603.     move.w    d1,d0
  1604.     add.w    d0,d0                    * 2倍
  1605.     move.w    IOCSF2_TBL(pc,d0.w),d0
  1606.     jmp    IOCSF2_TBL(pc,d0.w)            * 各モード指定に飛ぶ
  1607. IOCSF2_1:
  1608.     moveq.l    #$ff,d0                    * 設定値が範囲外
  1609.     rts
  1610.  
  1611. IOCSF2_TBL:
  1612.     .dc.w    F2_ANAGET-IOCSF2_TBL            * アナログジョイスティック読み込み
  1613.     .dc.w    F2_JOYMODE-IOCSF2_TBL            * ジョイスティックモード
  1614.     .dc.w    F2_SPEED-IOCSF2_TBL            * 通信速度設定
  1615.  
  1616. F2_ANAGET:
  1617.     movem.l    d1-d2/a1,-(a7)                * レジスタ保存
  1618.     moveq.l    #0,d1                    * ジョイスティック番号0
  1619.     bsr    IOCS3B                    * ジョイスティック読み込み
  1620.     move.b    COM_DATA+COM_ANALOG_DATA(pc),d2        * ステータス読み込み
  1621.     move.b    COM_DATA+COM_ANALOG_DATA+1(pc),d1    * 上下値読み込み
  1622.     btst.l    #0,d2                    * 上下値が有効か?
  1623.     bne    F2_ANAGET_1
  1624.     move.b    #$80,d1                    * センター値設定
  1625. F2_ANAGET_1:
  1626.     move.w    d1,(a1)+                * 上下値セット
  1627.     move.b    COM_DATA+COM_ANALOG_DATA+2(pc),d1    * 左右値読み込み
  1628.     btst.l    #1,d2                    * 左右値が有効か?
  1629.     bne    F2_ANAGET_2
  1630.     move.b    #$80,d1                    * センター値設定
  1631. F2_ANAGET_2:
  1632.     move.w    d1,(a1)+                * 左右値セット
  1633.     move.b    COM_DATA+COM_ANALOG_DATA+3(pc),d1    * 上下値読み込み(右スティック)
  1634.     btst.l    #2,d2                    * 上下値が有効か?
  1635.     bne    F2_ANAGET_3
  1636.     move.b    COM_DATA+COM_ANALOG_DATA+5(pc),d1    * ボタン1(アナログ)値読み込み
  1637.     btst.l    #4,d2                    * ボタン1(アナログ)が有効か?
  1638.     bne    F2_ANAGET_3
  1639.     move.b    #$80,d1                    * センター値設定
  1640. F2_ANAGET_3:
  1641.     move.w    d1,(a1)+                * スロットル値セット
  1642.     move.b    COM_DATA+COM_ANALOG_DATA+4(pc),d1    * 左右値読み込み(右スティック)
  1643.     btst.l    #3,d2                    * 左右値が有効か?
  1644.     bne    F2_ANAGET_4
  1645.     move.b    COM_DATA+COM_ANALOG_DATA+6(pc),d1    * ボタン2(アナログ)値読み込み
  1646.     btst.l    #5,d2                    * ボタン2(アナログ)が有効か?
  1647.     bne    F2_ANAGET_4
  1648.     move.b    #$80,d1                    * センター値設定
  1649. F2_ANAGET_4:
  1650.     move.w    d1,(a1)+                * オプション値セット
  1651.     move.w    d0,(a1)                    * ボタン(デジタル)値セット
  1652.     moveq.l    #0,d0                    * 正常終了
  1653.     movem.l    (a7)+,d1-d2/a1                * レジスタ復帰
  1654.     rts
  1655.  
  1656. F2_JOYMODE:
  1657.     move.l    d1,-(a7)                * レジスタ保存
  1658.     moveq.l    #0,d1                    * ジョイスティック番号0
  1659.     bsr    IOCS3B                    * ジョイスティック読み込み
  1660.     moveq.l    #0,d0
  1661.     move.b    COM_DATA+COM_ANALOG_DATA(pc),d0        * 有効なアナログ値がないか?
  1662.     beq    F2_JOYMODE_1
  1663.     moveq.l    #1,d0                    * アナログモード
  1664. F2_JOYMODE_1:
  1665.     move.l    (a7)+,d1                * レジスタ復帰
  1666.     rts
  1667.  
  1668. F2_SPEED:
  1669.     moveq.l    #0,d0                    * 最高速度
  1670.     rts
  1671.  
  1672. IOCS3B_VEC:
  1673.     .dc.l    0
  1674. IOCSF2_VEC:
  1675.     .dc.l    0
  1676. STRTG_ADR:
  1677.     .dc.l    0                    * ストラテジアドレス
  1678. STRTG_RTN:
  1679.     move.l    a5,STRTG_ADR                * ストラテジルーチン
  1680.     rts
  1681. DEV_RTN:
  1682.     movem.l    d0-d6/a1-a2/a5,-(a7)            * ドライバルーチン
  1683.     movea.l    STRTG_ADR(pc),a5            * ストラテジアドレス取得
  1684.     move.w    #$5003,d0                * エラーリターン
  1685.     tst.b    $0002(a5)                * 処理番号チェック
  1686.     bne    DEV_RTN1                * 初期化以外か?
  1687.     bsr    DEV_INIT                * デバイスドライバ初期化
  1688. DEV_RTN1:
  1689.     move.b    d0,$0003(a5)
  1690.     lsr.w    #8,d0
  1691.     move.b    d0,$0004(a5)                * エラーコードセット
  1692.     movem.l    (a7)+,d0-d6/a1-a2/a5            * レジスタ復帰
  1693.     rts
  1694.  
  1695. DEV_INIT:                        * ドライバ初期化
  1696.     pea    TITLE(pc)
  1697.     .dc.w    $ff09                    * タイトル表示
  1698.     addq.w    #4,a7                    * スタック補正
  1699.     bsr    KEEP_CHK1
  1700.     tst.l    d0
  1701.     beq    DEV_INIT_1
  1702.     pea    MSG_DATA1(pc)
  1703. DEV_INIT_0:
  1704.     .dc.w    $ff09
  1705.     addq.w    #4,a7
  1706.     move.w    #1,d0                    * エラーコード異常終了セット
  1707.     rts
  1708. DEV_INIT_1:
  1709.     bsr    PARM_RTN1
  1710.     tst.l    d0
  1711.     bmi    DEV_INIT_3
  1712.     move.b    SW_R(pc),d0
  1713.     bne    DEV_INIT_3
  1714.     pea    TITLE2(pc)
  1715.     .dc.w    $ff09
  1716.     pea    IOCS3B(pc)                * 処理アドレスセット
  1717.     move.w    #$013b,-(a7)                * ベクタ番号(IOCS$3B)セット
  1718.     .dc.w    $ff25                    * ベクタセット
  1719.     pea    IOCSF2(pc)                * 処理アドレスセット
  1720.     move.w    #$01f2,-(a7)                * ベクタ番号(IOCS$F2)セット
  1721.     .dc.w    $ff25                    * ベクタセット
  1722.     lea.l    16(a7),a7
  1723.     moveq.l    #$ff,d1
  1724.     moveq.l    #0,d2
  1725.     moveq.l    #0,d3
  1726.     moveq.l    #$3b,d0
  1727.     trap    #15
  1728.     bsr    MODE_DSP
  1729.     move.l    #DEV_INIT,$000e(a5)            * デバイスドライバ最終アドレスセット
  1730.     clr.w    d0                    * エラーコード正常終了セット
  1731.     rts
  1732. DEV_INIT_3:
  1733.     pea    MSG_DATA10(pc)
  1734.     bra    DEV_INIT_0
  1735.  
  1736. PARM_RTN1:
  1737.     movea.l    18(a5),a1
  1738. PARM_RTN1_1:
  1739.     tst.b    (a1)+
  1740.     bne    PARM_RTN1_1
  1741. PARM_RTN1_2:
  1742.     tst.b    (a1)
  1743.     beq    PARM_RTN1_4
  1744. PARM_RTN1_3:
  1745.     move.b    (a1)+,d0
  1746.     beq    PARM_RTN1_2
  1747.     bsr    PARM_SUB
  1748.     tst.l    d0
  1749.     beq    PARM_RTN1_3
  1750.     rts
  1751. PARM_RTN1_4:
  1752.     moveq.l    #0,d0
  1753.     rts
  1754.  
  1755. MAIN:
  1756.     pea    TITLE(pc)
  1757.     .dc.w    $ff09                    * タイトル表示
  1758.     addq.w    #4,a7
  1759.     movea.l    a2,a1
  1760.     bsr    PARM_RTN2
  1761.     tst.l    d0
  1762.     bmi    MAIN_5
  1763.     bsr    KEEP_CHK2
  1764.     tst.l    d0
  1765.     beq    MAIN_1
  1766.     move.b    SW_R(pc),d0
  1767.     bne    MAIN_4
  1768.     pea    MSG_DATA2(pc)
  1769. MAIN_0:
  1770.     bsr    MODE_CHG
  1771.     move.b    SW_D(pc),d0
  1772.     bne    MAIN_01
  1773.     bsr    MODE_DSP
  1774. MAIN_01:
  1775.     .dc.w    $ff09
  1776.     addq.w    #4,a7
  1777.     .dc.w    $ff00
  1778. MAIN_1:
  1779.     bsr    KEEP_CHK1
  1780.     tst.l    d0
  1781.     beq    MAIN_2
  1782.     pea    MSG_DATA1(pc)
  1783.     bra    MAIN_0
  1784. MAIN_2:
  1785.     move.b    SW_R(pc),d0
  1786.     beq    MAIN_3
  1787.     pea    MSG_DATA3(pc)
  1788.     bra    MAIN_01
  1789. MAIN_3:
  1790.     pea    IOCS3B(pc)                * 処理アドレスセット
  1791.     move.w    #$013b,-(a7)                * ベクタ番号(IOCS$3B)セット
  1792.     .dc.w    $ff25                    * ベクタセット
  1793.     move.l    d0,IOCS3B_VEC
  1794.     pea    IOCSF2(pc)                * 処理アドレスセット
  1795.     move.w    #$01f2,-(a7)                * ベクタ番号(IOCS$F2)セット
  1796.     .dc.w    $ff25                    * ベクタセット
  1797.     move.l    d0,IOCSF2_VEC
  1798.     lea.l    12(a7),a7
  1799.     moveq.l    #$ff,d1
  1800.     moveq.l    #0,d2
  1801.     moveq.l    #0,d3
  1802.     moveq.l    #$3b,d0
  1803.     trap    #15
  1804.     move.b    SW_D(pc),d0
  1805.     bne    MAIN_31
  1806.     pea    TITLE2(pc)
  1807.     .dc.w    $ff09
  1808.     addq.w    #4,a7
  1809.     bsr    MODE_DSP
  1810. MAIN_31:
  1811.     pea    MSG_DATA4(pc)
  1812.     .dc.w    $ff09
  1813.     addq.w    #2,a7
  1814.     clr.w    (a7)
  1815.     move.l    #DEV_INIT-DEVHEAD,-(a7)
  1816.     .dc.w    $ff31
  1817. MAIN_4:
  1818.     bsr    KEEP_CHK3
  1819.     tst.l    d0
  1820.     bne    MAIN_41
  1821.     pea    MSG_DATA6(pc)
  1822.     bra    MAIN_01
  1823. MAIN_41:
  1824.     moveq.l    #$ff,d1
  1825.     moveq.l    #0,d2
  1826.     moveq.l    #1,d3
  1827.     moveq.l    #$3b,d0
  1828.     trap    #15
  1829.     lea.l    IOCS3B_VEC-DEVHEAD+256(a0),a1
  1830.     move.l    (a1),-(a7)
  1831.     move.w    #$013b,-(a7)                * ベクタ番号(IOCS$3B)セット
  1832.     .dc.w    $ff25                    * ベクタセット
  1833.     lea.l    IOCSF2_VEC-DEVHEAD+256(a0),a1
  1834.     move.l    (a1),2(a7)
  1835.     move.w    #$01f2,(a7)                * ベクタ番号(IOCS$F2)セット
  1836.     .dc.w    $ff25                    * ベクタセット
  1837.     pea    $10(a0)
  1838.     .dc.w    $ff49
  1839.     pea    MSG_DATA5(pc)
  1840.     .dc.w    $ff09
  1841.     lea.l    14(a7),a7
  1842.     .dc.w    $ff00
  1843. MAIN_5:
  1844.     pea    MSG_DATA10(pc)
  1845.     .dc.w    $ff09
  1846.     pea    TITLE3(pc)
  1847.     .dc.w    $ff09
  1848.     addq.w    #8,a7
  1849.     .dc.w    $ff00
  1850.  
  1851. MODE_CHG:
  1852.     moveq.l    #$ff,d1
  1853.     move.b    SW_M(pc),d0
  1854.     beq    MODE_CHG2
  1855.     moveq.l    #$10,d2
  1856.     move.w    COM_DATA+COM_HANTEI_MODE(pc),d3
  1857.     moveq.l    #$3b,d0
  1858.     trap    #15
  1859. MODE_CHG2:
  1860.     moveq.l    #JOY_MAX-1,d4
  1861.     move.w    d4,d0
  1862.     lsl.w    #8,d0
  1863.     lea.l    JOY_DATA(pc),a2
  1864.     adda.w    d0,a2
  1865.     lea.l    SW_B+JOY_MAX(pc),a3
  1866. MODE_CHG2_1:
  1867.     tst.b    -(a3)
  1868.     beq    MODE_CHG2_3
  1869.     move.w    JOY_CNV_MODE(a2),d3
  1870.     beq    MODE_CHG2_2
  1871.     lea.l    JOY_CNV_DATA(a2),a1
  1872.     moveq.l    #$12,d2
  1873.     moveq.l    #$3b,d0
  1874.     trap    #15
  1875. MODE_CHG2_2:
  1876.     moveq.l    #$11,d2
  1877.     moveq.l    #$3b,d0
  1878.     trap    #15
  1879. MODE_CHG2_3:
  1880.     lea.l    -DATA_SIZE(a2),a2
  1881.     dbra    d4,MODE_CHG2_1
  1882. MODE_CHG3:
  1883.     move.b    SW_I(pc),d0
  1884.     beq    MODE_CHG4
  1885.     moveq.l    #$13,d2
  1886.     move.w    COM_DATA+COM_IOCS3B_OUT(pc),d3
  1887.     moveq.l    #$3b,d0
  1888.     trap    #15
  1889. MODE_CHG4:
  1890.     move.b    SW_T(pc),d0
  1891.     beq    MODE_CHG5
  1892.     moveq.l    #$15,d2
  1893.     move.w    COM_DATA+COM_JOY1_MAX(pc),d3
  1894.     moveq.l    #$3b,d0
  1895.     trap    #15
  1896. MODE_CHG5:
  1897.     moveq.l    #JOY_MAX-1,d4
  1898.     move.w    d4,d0
  1899.     lsl.w    #8,d0
  1900.     lea.l    JOY_DATA(pc),a2
  1901.     adda.w    d0,a2
  1902.     lea.l    SW_E+JOY_MAX(pc),a3
  1903. MODE_CHG6_1:
  1904.     tst.b    -(a3)
  1905.     beq    MODE_CHG6_2
  1906.     move.w    JOY_PLUS_EMU(a2),d3
  1907.     moveq.l    #$16,d2
  1908.     moveq.l    #$3b,d0
  1909.     trap    #15
  1910. MODE_CHG6_2:
  1911.     lea.l    -DATA_SIZE(a2),a2
  1912.     dbra    d4,MODE_CHG6_1
  1913.     moveq.l    #JOY_MAX-1,d4
  1914.     move.w    d4,d0
  1915.     lsl.w    #8,d0
  1916.     lea.l    JOY_DATA(pc),a2
  1917.     adda.w    d0,a2
  1918.     lea.l    SW_P+JOY_MAX(pc),a3
  1919. MODE_CHG7_1:
  1920.     tst.b    -(a3)
  1921.     beq    MODE_CHG7_2
  1922.     move.w    JOY_PLUS_EMU+2(a2),d3
  1923.     moveq.l    #$17,d2
  1924.     moveq.l    #$3b,d0
  1925.     trap    #15
  1926. MODE_CHG7_2:
  1927.     lea.l    -DATA_SIZE(a2),a2
  1928.     dbra    d4,MODE_CHG7_1
  1929.     rts
  1930.  
  1931. MODE_DSP:
  1932.     pea    MSG_DATA20(pc)
  1933.     .dc.w    $ff09
  1934.     moveq.l    #$ff,d1
  1935.     moveq.l    #$10,d2
  1936.     moveq.l    #$ff,d3
  1937.     moveq.l    #$3b,d0
  1938.     trap    #15
  1939.     tst.w    d0
  1940.     beq    MODE_DSP_2
  1941.     cmpi.w    #1,d0
  1942.     bne    MODE_DSP_1
  1943.     pea    MSG_DATA22(pc)
  1944.     bra    MODE_DSP_3
  1945. MODE_DSP_1:
  1946.     pea    MSG_DATA23(pc)
  1947.     bra    MODE_DSP_3
  1948. MODE_DSP_2:
  1949.     pea    MSG_DATA21(pc)
  1950. MODE_DSP_3:
  1951.     .dc.w    $ff09
  1952.     pea    MSG_DATA30(pc)
  1953.     .dc.w    $ff09
  1954.     lea.l    12(a7),a7
  1955.     moveq.l    #$15,d2
  1956.     moveq.l    #$3b,d0
  1957.     trap    #15
  1958.     move.w    d0,d5
  1959.     moveq.l    #JOY_MAX-1,d6
  1960.     moveq.l    #0,d4
  1961. MODE_DSP_4:
  1962.     pea    MSG_DATA31(pc)
  1963.     .dc.w    $ff09
  1964.     lea.l    MSG_DATA32(pc),a1
  1965.     move.b    d4,d0
  1966.     addi.b    #$30,d0
  1967.     move.b    d0,(a1)
  1968.     move.l    a1,(a7)
  1969.     .dc.w    $ff09
  1970.     moveq.l    #$11,d2
  1971.     moveq.l    #$3b,d0
  1972.     trap    #15
  1973.     tst.w    d0
  1974.     beq    MODE_DSP_5
  1975.     pea    MSG_DATA41(pc)
  1976.     bra    MODE_DSP_6
  1977. MODE_DSP_5:
  1978.     pea    MSG_DATA40(pc)
  1979. MODE_DSP_6:
  1980.     .dc.w    $ff09
  1981.     addq.w    #8,a7
  1982.     pea    MSG_DATA33(pc)
  1983.     .dc.w    $ff09
  1984.     lea.l    TITLE(pc),a1
  1985.     moveq.l    #8,d2
  1986.     move.w    d4,d3
  1987.     moveq.l    #$3b,d0
  1988.     trap    #15
  1989.     tst.l    d0
  1990.     bmi    MODE_DSP_8
  1991.     andi.w    #$00ff,d0
  1992.     lea.l    PAD_DISP_INFO(pc),a2
  1993. PAD_DISP_1:
  1994.     move.l    (a2)+,d2
  1995.     bmi    PAD_DISP_2
  1996.     cmp.l    d2,d0
  1997.     beq    PAD_DISP_2
  1998.     addq.w    #4,a2
  1999.     bra    PAD_DISP_1
  2000. PAD_DISP_2:
  2001.     move.l    (a2),-(a7)
  2002.     bra    MODE_DSP_9
  2003. MODE_DSP_8:
  2004.     pea    MSG_DATA47(pc)
  2005. MODE_DSP_9:
  2006.     .dc.w    $ff09
  2007.     addq.w    #8,a7
  2008.     pea    MSG_DATA34(pc)
  2009.     .dc.w    $ff09
  2010.     cmp.w    d5,d4
  2011.     beq    MODE_DSP_10
  2012.     bcs    MODE_DSP_11
  2013.     pea    MSG_DATA46(pc)
  2014.     bra    MODE_DSP_12
  2015. MODE_DSP_10:
  2016.     pea    MSG_DATA45(pc)
  2017.     bra    MODE_DSP_12
  2018. MODE_DSP_11:
  2019.     pea    MSG_DATA44(pc)
  2020. MODE_DSP_12:
  2021.     .dc.w    $ff09
  2022.     addq.w    #8,a7
  2023.     pea    MSG_DATA35(pc)
  2024.     .dc.w    $ff09
  2025.     cmpi.w    #1,d4
  2026.     beq    MODE_DSP_13
  2027.     bcs    MODE_DSP_14
  2028.     pea    MSG_DATA46(pc)
  2029.     bra    MODE_DSP_15
  2030. MODE_DSP_13:
  2031.     pea    MSG_DATA45(pc)
  2032.     bra    MODE_DSP_15
  2033. MODE_DSP_14:
  2034.     pea    MSG_DATA44(pc)
  2035. MODE_DSP_15:
  2036.     .dc.w    $ff09
  2037.     addq.w    #8,a7
  2038.     pea    MSG_DATA36(pc)
  2039.     .dc.w    $ff09
  2040.     lea.l    MSG_DATA37(pc),a1
  2041.     moveq.l    #$16,d2
  2042.     moveq.l    #$ff,d3
  2043.     moveq.l    #$3b,d0
  2044.     trap    #15
  2045.     move.b    d0,d2
  2046.     lsr.b    #4,d2
  2047.     move.b    DTOH_TBL(pc,d2.w),(a1)
  2048.     andi.w    #$000f,d0
  2049.     move.b    DTOH_TBL(pc,d0.w),1(a1)
  2050.     move.l    a1,(a7)
  2051.     .dc.w    $ff09
  2052.     lea.l    MSG_DATA38(pc),a1
  2053.     moveq.l    #$17,d2
  2054.     moveq.l    #$3b,d0
  2055.     trap    #15
  2056.     move.b    d0,d2
  2057.     lsr.b    #4,d2
  2058.     move.b    DTOH_TBL(pc,d2.w),(a1)
  2059.     andi.w    #$000f,d0
  2060.     move.b    DTOH_TBL(pc,d0.w),1(a1)
  2061.     move.l    a1,(a7)
  2062.     .dc.w    $ff09
  2063.     addq.w    #4,a7
  2064.     addq.w    #1,d4
  2065.     dbra    d6,MODE_DSP_4
  2066.     moveq.l    #$13,d2
  2067.     moveq.l    #$3b,d0
  2068.     trap    #15
  2069.     tst.w    d0
  2070.     bne    MODE_DSP_20
  2071.     pea    MSG_DATA25(pc)
  2072.     bra    MODE_DSP_21
  2073. MODE_DSP_20:
  2074.     pea    MSG_DATA24(pc)
  2075. MODE_DSP_21:
  2076.     .dc.w    $ff09
  2077.     addq.w    #4,a7
  2078.     rts
  2079.  
  2080. DTOH_TBL:
  2081.     .dc.b    '0'
  2082.     .dc.b    '1'
  2083.     .dc.b    '2'
  2084.     .dc.b    '3'
  2085.     .dc.b    '4'
  2086.     .dc.b    '5'
  2087.     .dc.b    '6'
  2088.     .dc.b    '7'
  2089.     .dc.b    '8'
  2090.     .dc.b    '9'
  2091.     .dc.b    'A'
  2092.     .dc.b    'B'
  2093.     .dc.b    'C'
  2094.     .dc.b    'D'
  2095.     .dc.b    'E'
  2096.     .dc.b    'F'
  2097.  
  2098. KEEP_CHK1:
  2099.     movem.l    d1-d2/a1,-(a7)                * レジスタ保存
  2100.     moveq.l    #$ff,d1                    * モード指定
  2101.     moveq.l    #1,d2                    * 常駐状態取得
  2102.     moveq.l    #$3b,d0
  2103.     trap    #15
  2104.     tst.l    d0
  2105.     beq    KEEP_CHK1_1
  2106.     move.l    d0,a1
  2107.     moveq.l    #$84,d0
  2108.     trap    #15
  2109.     cmpi.l    #'JOYD',d0
  2110.     bne    KEEP_CHK1_2
  2111.     moveq.l    #$83,d0
  2112.     trap    #15
  2113.     cmpi.w    #'RV',d0
  2114.     bne    KEEP_CHK1_2
  2115.     moveq.l    #1,d0                    * 常駐している
  2116. KEEP_CHK1_1:
  2117.     movem.l    (a7)+,d1-d2/a1                * レジスタ復帰
  2118.     rts
  2119. KEEP_CHK1_2:
  2120.     moveq.l    #0,d0                    * 常駐していない
  2121.     bra    KEEP_CHK1_1
  2122.  
  2123. KEEP_CHK2:
  2124.     pea.l    $0000.w
  2125.     .dc.w    $ff20
  2126.     move.l    d0,(a7)
  2127. KEEP_CHK2_1:
  2128.     move.l    (a0),d1
  2129.     beq    KEEP_CHK2_2
  2130.     move.l    d1,a0
  2131.     cmpi.l    #'JOYD',256+14(a0)
  2132.     bne    KEEP_CHK2_1
  2133.     cmpi.w    #'RV',256+18(a0)
  2134.     bne    KEEP_CHK2_1
  2135.     moveq.l    #1,d1
  2136. KEEP_CHK2_2:
  2137.     .dc.w    $ff20
  2138.     addq.w    #4,a7
  2139.     move.l    d1,d0
  2140.     rts
  2141.  
  2142. KEEP_CHK3:
  2143.     movem.l    d1-d2/a1,-(a7)                * レジスタ保存
  2144.     moveq.l    #$ff,d1                    * モード指定
  2145.     moveq.l    #1,d2                    * 常駐状態取得
  2146.     moveq.l    #$3b,d0
  2147.     trap    #15
  2148.     tst.l    d0
  2149.     beq    KEEP_CHK3_1
  2150.     move.l    d0,a1
  2151.     moveq.l    #$84,d0
  2152.     trap    #15
  2153.     cmpi.l    #'JOYD',d0
  2154.     bne    KEEP_CHK3_2
  2155.     moveq.l    #$83,d0
  2156.     trap    #15
  2157.     cmpi.w    #'RV',d0
  2158.     bne    KEEP_CHK3_2
  2159.     addq.w    #2,a1
  2160.     moveq.l    #$84,d0
  2161.     trap    #15
  2162.     cmp.l    KEEP_CHK_VER(pc),d0
  2163.     bne    KEEP_CHK3_2
  2164.     moveq.l    #1,d0                    * 常駐している
  2165. KEEP_CHK3_1:
  2166.     movem.l    (a7)+,d1-d2/a1                * レジスタ復帰
  2167.     rts
  2168. KEEP_CHK3_2:
  2169.     moveq.l    #0,d0                    * 常駐していない
  2170.     bra    KEEP_CHK3_1
  2171.  
  2172. PARM_RTN2:
  2173.     tst.b    (a1)+
  2174.     beq    PARM_RTN2_2
  2175. PARM_RTN2_1:
  2176.     move.b    (a1)+,d0
  2177.     beq    PARM_RTN2_2
  2178.     cmpi.b    #' ',d0
  2179.     beq    PARM_RTN2_1
  2180.     bsr    PARM_SUB
  2181.     tst.l    d0
  2182.     beq    PARM_RTN2_1
  2183.     rts
  2184. PARM_RTN2_2:
  2185.     moveq.l    #0,d0
  2186.     rts
  2187.  
  2188. PARM_SUB:
  2189.     cmpi.b    #'/',d0
  2190.     beq    PARM_SUB_1
  2191.     cmpi.b    #'-',d0
  2192.     bne    PARM_SUB_ERR1
  2193. PARM_SUB_1:
  2194.     move.b    (a1)+,d0
  2195.     beq    PARM_SUB_ERR1
  2196.     ori.b    #$20,d0
  2197.     cmpi.b    #'m',d0
  2198.     beq    PARM_SUB_M
  2199.     cmpi.b    #'i',d0
  2200.     beq    PARM_SUB_I
  2201.     cmpi.b    #'r',d0
  2202.     beq    PARM_SUB_R
  2203.     cmpi.b    #'t',d0
  2204.     beq    PARM_SUB_T
  2205.     cmpi.b    #'e',d0
  2206.     beq    PARM_SUB_E
  2207.     cmpi.b    #'p',d0
  2208.     beq    PARM_SUB_P
  2209.     cmpi.b    #'d',d0
  2210.     beq    PARM_SUB_D
  2211.     cmpi.b    #'b',d0
  2212.     bne    PARM_SUB_ERR1
  2213. PARM_SUB_B:
  2214.     move.b    (a1)+,d0
  2215.     subi.b    #'0',d0
  2216.     cmpi.b    #JOY_MAX-1,d0
  2217.     bhi    PARM_SUB_ERR1
  2218.     ext.w    d0
  2219.     move.w    d0,d1
  2220.     move.b    (a1),d0
  2221.     beq    PARM_SUB_B2
  2222.     cmpi.b    #' ',d0
  2223.     beq    PARM_SUB_B2
  2224.     bsr    READ_CNV_DATA
  2225.     tst.l    d0
  2226.     bmi    PARM_SUB_ERR2
  2227.     moveq.l    #1,d0
  2228. PARM_SUB_B1:
  2229.     lea.l    SW_B(pc),a2
  2230.     st.b    0(a2,d1.w)
  2231.     lea.l    JOY_DATA(pc),a2
  2232.     lsl.w    #8,d1
  2233.     adda.w    d1,a2
  2234.     move.w    d0,JOY_CNV_MODE(a2)
  2235.     moveq.l    #0,d0
  2236.     rts
  2237. PARM_SUB_B2:
  2238.     moveq.l    #0,d0
  2239.     bra    PARM_SUB_B1
  2240. PARM_SUB_T:
  2241.     move.b    (a1)+,d0
  2242.     subi.b    #'0',d0
  2243.     cmpi.b    #9,d0
  2244.     bhi    PARM_SUB_ERR1
  2245.     ext.w    d0
  2246.     move.w    d0,COM_DATA+COM_JOY1_MAX
  2247.     st.b    SW_T
  2248.     moveq.l    #0,d0
  2249.     rts
  2250. PARM_SUB_E:
  2251.     move.b    (a1)+,d0
  2252.     subi.b    #'0',d0
  2253.     cmpi.b    #JOY_MAX-1,d0
  2254.     bhi    PARM_SUB_ERR1
  2255.     ext.w    d0
  2256.     move.w    d0,d1
  2257.     move.b    (a1)+,d0
  2258.     cmpi.b    #',',d0
  2259.     bne    PARM_SUB_ERR1
  2260.     move.b    (a1)+,d0
  2261.     ori.b    #$20,d0
  2262.     subi.b    #'0',d0
  2263.     cmpi.b    #9,d0
  2264.     bls    PARM_SUB_E1
  2265.     subi.b    #$31,d0
  2266.     cmpi.b    #5,d0
  2267.     bhi    PARM_SUB_ERR1
  2268.     addi.b    #10,d0
  2269. PARM_SUB_E1:
  2270.     ext.w    d0
  2271.     lea.l    SW_E(pc),a2
  2272.     st.b    0(a2,d1.w)
  2273.     lea.l    JOY_DATA(pc),a2
  2274.     lsl.w    #8,d1
  2275.     adda.w    d1,a2
  2276.     move.w    d0,JOY_PLUS_EMU(a2)
  2277.     moveq.l    #0,d0
  2278.     rts
  2279. PARM_SUB_P:
  2280.     move.b    (a1)+,d0
  2281.     subi.b    #'0',d0
  2282.     cmpi.b    #JOY_MAX-1,d0
  2283.     bhi    PARM_SUB_ERR1
  2284.     ext.w    d0
  2285.     move.w    d0,d1
  2286.     move.b    (a1)+,d0
  2287.     cmpi.b    #',',d0
  2288.     bne    PARM_SUB_ERR1
  2289.     moveq.l    #0,d2
  2290.     move.b    (a1)+,d2
  2291.     subi.b    #'0',d2
  2292.     cmpi.b    #7,d2
  2293.     bhi    PARM_SUB_ERR1
  2294.     lsl.b    #4,d2
  2295.     move.b    (a1)+,d0
  2296.     ori.b    #$20,d0
  2297.     subi.b    #'0',d0
  2298.     cmpi.b    #9,d0
  2299.     bls    PARM_SUB_P1
  2300.     subi.b    #$31,d0
  2301.     cmpi.b    #5,d0
  2302.     bhi    PARM_SUB_ERR1
  2303.     addi.b    #10,d0
  2304. PARM_SUB_P1:
  2305.     or.b    d0,d2
  2306.     lea.l    SW_P(pc),a2
  2307.     st.b    0(a2,d1.w)
  2308.     lea.l    JOY_DATA(pc),a2
  2309.     lsl.w    #8,d1
  2310.     adda.w    d1,a2
  2311.     move.w    d2,JOY_PLUS_EMU+2(a2)
  2312.     moveq.l    #0,d0
  2313.     rts
  2314. PARM_SUB_R:
  2315.     st.b    SW_R
  2316.     moveq.l    #0,d0
  2317.     rts
  2318. PARM_SUB_M:
  2319.     move.b    (a1)+,d0
  2320.     subi.b    #'0',d0
  2321.     cmpi.b    #2,d0
  2322.     bhi    PARM_SUB_ERR1
  2323.     ext.w    d0
  2324.     move.w    d0,COM_DATA+COM_HANTEI_MODE
  2325.     st.b    SW_M
  2326.     moveq.l    #0,d0
  2327.     rts
  2328. PARM_SUB_I:
  2329.     move.b    (a1)+,d0
  2330.     subi.b    #'0',d0
  2331.     cmpi.b    #1,d0
  2332.     bhi    PARM_SUB_ERR1
  2333.     ext.w    d0
  2334.     move.w    d0,COM_DATA+COM_IOCS3B_OUT
  2335.     st.b    SW_I
  2336.     moveq.l    #0,d0
  2337.     rts
  2338. PARM_SUB_D:
  2339.     st.b    SW_D
  2340.     moveq.l    #0,d0
  2341.     rts
  2342.  
  2343. PARM_SUB_ERR2:
  2344.     pea    MSG_DATA11(pc)
  2345.     .dc.w    $ff09
  2346.     addq.w    #4,a7
  2347. PARM_SUB_ERR1:
  2348.     moveq.l    #$ff,d0
  2349.     rts
  2350.  
  2351. READ_CNV_DATA:
  2352.     movem.l    d1/a2,-(a7)
  2353.     clr.w    -(a7)
  2354.     move.l    a1,-(a7)
  2355. READ_CNV_DATA_1:
  2356.     move.b    (a1)+,d0
  2357.     beq    READ_CNV_DATA_2
  2358.     cmpi.b    #' ',d0
  2359.     bne    READ_CNV_DATA_1
  2360.     clr.b    -(a1)
  2361.     .dc.w    $ff3d
  2362.     move.b    #' ',(a1)
  2363.     bra    READ_CNV_DATA_5
  2364. READ_CNV_DATA_2:
  2365.     subq.w    #1,a1
  2366.     .dc.w    $ff3d
  2367. READ_CNV_DATA_5:
  2368.     addq.w    #6,a7
  2369.     tst.l    d0
  2370.     bmi    READ_CNV_DATA_3
  2371.     pea.l    $0032.w
  2372.     lsl.w    #8,d1
  2373.     lea.l    JOY_DATA+JOY_CNV_DATA(pc),a2
  2374.     pea    0(a2,d1.w)
  2375.     move.w    d0,-(a7)
  2376.     .dc.w    $ff3f
  2377.     move.l    d0,d1
  2378.     .dc.w    $ff3e
  2379.     lea.l    10(a7),a7
  2380.     move.l    d1,d0
  2381.     bmi    READ_CNV_DATA_3
  2382.     cmpi.l    #32,d1
  2383.     bcs    READ_CNV_DATA_4
  2384.     moveq.l    #0,d0
  2385. READ_CNV_DATA_3:
  2386.     movem.l    (a7)+,d1/a2
  2387.     rts
  2388. READ_CNV_DATA_4:
  2389.     moveq.l    #$ff,d0
  2390.     bra    READ_CNV_DATA_3
  2391.  
  2392. .data
  2393. PAD_DISP_INFO:
  2394.     .dc.l    PAD_TYPE_ATARI*65536,MSG_DATA_PAD_ATARI
  2395.     .dc.l    PAD_TYPE_MD*65536+$00,MSG_DATA_PAD_MD3
  2396.     .dc.l    PAD_TYPE_MD*65536+$01,MSG_DATA_PAD_MD6
  2397.     .dc.l    PAD_TYPE_MD*65536+$0f,MSG_DATA_PAD_MDNC
  2398.     .dc.l    PAD_TYPE_SS*65536+$00,MSG_DATA_PAD_SSD
  2399.     .dc.l    PAD_TYPE_SS*65536+$01,MSG_DATA_PAD_SSA
  2400.     .dc.l    PAD_TYPE_SS*65536+$0f,MSG_DATA_PAD_SSNC
  2401.     .dc.l    PAD_TYPE_PS*65536+$01,MSG_DATA_PAD_PSMOUSE
  2402.     .dc.l    PAD_TYPE_PS*65536+$02,MSG_DATA_PAD_PSA1
  2403.     .dc.l    PAD_TYPE_PS*65536+$04,MSG_DATA_PAD_PSD
  2404.     .dc.l    PAD_TYPE_PS*65536+$05,MSG_DATA_PAD_PSA2
  2405.     .dc.l    PAD_TYPE_PS*65536+$07,MSG_DATA_PAD_PSA2
  2406.     .dc.l    PAD_TYPE_PS*65536+$0e,MSG_DATA_PAD_PSJOGCON
  2407.     .dc.l    PAD_TYPE_PS*65536+$0f,MSG_DATA_PAD_PSNC
  2408.     .dc.l    $ffffffff,MSG_DATA_PAD_UNKNOW
  2409.  
  2410. SW_D:
  2411.     .dc.b    0
  2412. SW_I:
  2413.     .dc.b    0
  2414. SW_R:
  2415.     .dc.b    0
  2416. SW_M:
  2417.     .dc.b    0
  2418. SW_T:
  2419.     .dc.b    0
  2420. SW_E:
  2421.     .dcb.b    JOY_MAX,0
  2422. SW_P:
  2423.     .dcb.b    JOY_MAX,0
  2424. SW_B:
  2425.     .dcb.b    JOY_MAX,0
  2426. .even
  2427. TITLE:
  2428.     .dc.b    $0d,$0a
  2429.     .dc.b    'JOYSTICK DRIVER for X680x0 version 2.10',$0d,$0a
  2430.     .dc.b    'Copyright 1994-98 by HUYE',$0d,$0a,0
  2431. TITLE2:
  2432.     .dc.b    'CPSF-PCアダプタ、MD変換コネクタの使用が可能です',$0d,$0a,0
  2433. TITLE3:
  2434.     .dc.b    '<usage> JOYDRV.X [option]',$0d,$0a
  2435.     .dc.b    '<option>',$0d,$0a
  2436.     .dc.b    ' /M0           .. MDマルチタップ及びSS,PS接続ケーブルを使用不可にする',$0d,$0a
  2437.     .dc.b    ' /M1           .. MDマルチタップ及びSS,PS接続ケーブルを使用可能にする(キャッシュ無し)',$0d,$0a
  2438.     .dc.b    ' /M2           .. MDマルチタップ及びSS,PS接続ケーブルを使用可能にする(キャッシュ有り)(def.)',$0d,$0a
  2439.     .dc.b    ' /B?           .. ビット変換無し(?はジョイスティック番号0~6)(def.)',$0d,$0a
  2440.     .dc.b    ' /B?ファイル名 .. ビット変換有り(ファイル名は、変換データを格納しているファイル、',$0d,$0a
  2441.     .dc.b    '                                  ?はジョイスティック番号0~6)',$0d,$0a
  2442.     .dc.b    ' /I0           .. ROM IOCS互換モード',$0d,$0a
  2443.     .dc.b    ' /I1           .. JOYDRV拡張モード(def.)',$0d,$0a
  2444.     .dc.b    ' /T?           .. マルチタップ使用時のマルチタップの最大パッド数(?は、0~9)(def.=',$2f+JOY_MAX,')',$0d,$0a
  2445.     .dc.b    ' /E?,?         .. アナログスティックの十字キーエミュレート指定',$0d,$0a
  2446.     .dc.b    '                   1つ目の?はジョイスティック番号0~6、2つ目の?は、0~F(def.=3)',$0d,$0a
  2447.     .dc.b    ' /P?,??        .. 十字キーエミュレート時のしきい値指定',$0d,$0a
  2448.     .dc.b    '                   1つ目の?はジョイスティック番号0~6、2つ目の??は、00~7F(def.=4F)',$0d,$0a
  2449.     .dc.b    ' /D            .. 設定状態の表示禁止',$0d,$0a
  2450.     .dc.b    ' /R            .. 常駐解除(コマンドラインからの実行時のみ有効)',$0d,$0a
  2451.     .dc.b    '/は-でも可、アルファベットは小文字も可',$0d,$0a,0
  2452. MSG_DATA1:
  2453.     .dc.b    'JOYDRVは既に登録されています',$0d,$0a,0
  2454. MSG_DATA2:
  2455.     .dc.b    'JOYDRVは既に常駐しています',$0d,$0a,0
  2456. MSG_DATA3:
  2457.     .dc.b    'JOYDRVは常駐していません',$0d,$0a,0
  2458. MSG_DATA4:
  2459.     .dc.b    'JOYDRVは常駐しました',$0d,$0a,0
  2460. MSG_DATA5:
  2461.     .dc.b    'JOYDRVの常駐を解除しました',$0d,$0a,0
  2462. MSG_DATA6:
  2463.     .dc.b    'IOCS$3Bのベクタが変更されているかJOYDRVのバージョンが違うので常駐が解除できません',$0d,$0a,0
  2464. MSG_DATA10:
  2465.     .dc.b    'パラメータ指定に誤りがあります',$0d,$0a,0
  2466. MSG_DATA11:
  2467.     .dc.b    '変換データファイルの読み込みに失敗しました',$0d,$0a,0
  2468. MSG_DATA20:
  2469.     .dc.b    'MDマルチタップ及びSS,PSパッド接続ケーブルは使用',0
  2470. MSG_DATA21:
  2471.     .dc.b    'できません',$0d,$0a,0
  2472. MSG_DATA22:
  2473.     .dc.b    '可能です(キャッシュ無し)',$0d,$0a,0
  2474. MSG_DATA23:
  2475.     .dc.b    '可能です(キャッシュ有り)',$0d,$0a,0
  2476. MSG_DATA24:
  2477.     .dc.b    'JOYDRV拡張モードで動作しています',$0d,$0a,0
  2478. MSG_DATA25:
  2479.     .dc.b    'ROM IOCS互換モードで動作しています',$0d,$0a,0
  2480. MSG_DATA30:
  2481.     .dc.b    'ジョイスティック番号  ビット変換  接続(マルチタップあり:マルチタップ無し)  十字キーエミュレート  しきい値',$0d,$0a,0
  2482. MSG_DATA31:
  2483.     .dc.b    '      ',0
  2484. MSG_DATA32:
  2485.     .dc.b    '0          ',0
  2486. MSG_DATA33:
  2487.     .dc.b    '    ',0
  2488. MSG_DATA34:
  2489.     .dc.b    '   ',0
  2490. MSG_DATA35:
  2491.     .dc.b    ' : ',0
  2492. MSG_DATA36:
  2493.     .dc.b    '              ',0
  2494. MSG_DATA37:
  2495.     .dc.b    '03          ',0
  2496. MSG_DATA38:
  2497.     .dc.b    '4F',$0d,$0a,0
  2498. MSG_DATA40:
  2499.     .dc.b    '無し',0
  2500. MSG_DATA41:
  2501.     .dc.b    '有り',0
  2502. MSG_DATA44:
  2503.     .dc.b    'PORT1',0
  2504. MSG_DATA45:
  2505.     .dc.b    'PORT2',0
  2506. MSG_DATA46:
  2507.     .dc.b    '-----',0
  2508. MSG_DATA47:
  2509.     .dc.b    '--------',0
  2510. MSG_DATA_PAD_UNKNOW:
  2511.     .dc.b    '不明  ',0
  2512. MSG_DATA_PAD_ATARI:
  2513.     .dc.b    'アタリ ',0
  2514. MSG_DATA_PAD_MD3:
  2515.     .dc.b    'メガドラ3B',0
  2516. MSG_DATA_PAD_MD6:
  2517.     .dc.b    'メガドラ6B',0
  2518. MSG_DATA_PAD_MDNC:
  2519.     .dc.b    'メガドラNC',0
  2520. MSG_DATA_PAD_SSD:
  2521.     .dc.b    'SSデジタル',0
  2522. MSG_DATA_PAD_SSA:
  2523.     .dc.b    'SSアナログ ',0
  2524. MSG_DATA_PAD_SSNC:
  2525.     .dc.b    'SS N.C. ',0
  2526. MSG_DATA_PAD_PSD:
  2527.     .dc.b    'PSデジタル',0
  2528. MSG_DATA_PAD_PSA2:
  2529.     .dc.b    'PSアナログ2',0
  2530. MSG_DATA_PAD_PSA1:
  2531.     .dc.b    'PSアナログ1',0
  2532. MSG_DATA_PAD_PSMOUSE:
  2533.     .dc.b    'PSマウス',0
  2534. MSG_DATA_PAD_PSJOGCON:
  2535.     .dc.b    'PSジョグ ',0
  2536. MSG_DATA_PAD_PSNC:
  2537.     .dc.b    'PS N.C. ',0
  2538. .end    MAIN
  2539.